第1,2,3,4行有什么区别?
我什么时候使用?
为什么第3行打印constructor Foo
和第7行返回错误而第8行没有?
#include <iostream>
using namespace std;
class Foo
{
public:
Foo ( )
{
cout << "constructor Foo\n";
}
};
class Bar
{
public:
Bar ( Foo )
{
cout << "constructor Bar\n";
}
};
int main()
{
/* 1 */ Foo* foo1 = new Foo ();
/* 2 */ Foo* foo2 = new Foo;
/* 3 */ Foo foo3;
/* 4 */ Foo foo4 = Foo::Foo();
/* 5 */ Bar* bar1 = new Bar …
Run Code Online (Sandbox Code Playgroud) 根据我的理解,在标准C++中,无论何时使用new运算符,您还必须在某些时候使用delete运算符来防止内存泄漏.这是因为C++中没有垃圾收集.在.NET中,垃圾收集是自动的,因此无需担心内存管理.我的理解是否正确?谢谢.
我遇到了对C++指针缺乏深刻理解的问题.我写了一个名为Skymap的类,它有以下定义:
class Skymap {
public:
Skymap();
~Skymap();
void DrawAitoffSkymap();
private:
TCanvas mCanvas;
TBox* mSkymapBorderBox;
};
Run Code Online (Sandbox Code Playgroud)
功能定义为:
#include "Skymap.h"
Skymap::Skymap()
{
mCanvas.SetCanvasSize(1200,800);
mMarkerType=1;
}
Skymap::~Skymap()
{
delete mSkymapBorderBox;
}
void Skymap::DrawAitoffSkymap()
{
TBox* mSkymapBorderBox=new TBox(-200,-100,200,100);
//Use the mSkymapBorderBox pointer for a while
}
Run Code Online (Sandbox Code Playgroud)
(我正在使用ROOT绘图包,但我认为这只是一个普通的C++问题).
现在,以下程序在到达skymap2的析构函数时会崩溃:
int main(){
Skymap skymap1;
Skymap skymap2;
skymap1.DrawAitoffSkymap();
skymap2.DrawAitoffSkymap();
return(0);
}
Run Code Online (Sandbox Code Playgroud)
但是,以下内容不会崩溃:
int main(){
Skymap skymap1;
skymap1.DrawAitoffSkymap();
return(0);
}
Run Code Online (Sandbox Code Playgroud)
此外,如果我在构造函数中将指针mSkymapBorderBox初始化为NULL,则在执行第一个程序(使用2个Skymap对象)后,我不会再遇到崩溃.
任何人都可以解释一下其根本原因是什么?它似乎是第二个Skymap对象中指针的问题,但我看不出它是什么.
我学习用C动态内存分配++和关键字new
和new[]
被提及.据说,用户可以在运行时指定内存分配的大小,而不像在源代码中声明一个具有固定大小的变量或数组.
我不明白这个概念.它是如何工作的?我只需要澄清这个想法,一个例子会有所帮助!
c++ malloc memory-management new-operator dynamic-allocation
我想知道这是否会导致内存泄漏:
std::string test() {
return *(new std::string(""));
}
Run Code Online (Sandbox Code Playgroud) 在使用托管内存和函数式语言大约10年之后,我终于回到了C++,并且智能指针让我感到困惑.有一半的文档仍然是关于已弃用的auto_ptr
.
我正在尝试实施这个相当简单的Bullet "hello world"程序:
int _tmain(int argc, _TCHAR* argv[])
{
auto bp = unique_ptr<btBroadphaseInterface>(new btDbvtBroadphase);
auto cc = unique_ptr<btDefaultCollisionConfiguration>(new btDefaultCollisionConfiguration);
auto disp = unique_ptr<btDispatcher>(new btCollisionDispatcher(cc));
}
Run Code Online (Sandbox Code Playgroud)
该btCollisionDispatcher
构造想要一个btCollisionConfiguration*
,但我它赋予unique_ptr
一个替代.
在这种情况下我通常想做什么?如果有一种"去智能"指针的方法,有些东西告诉我这unique_ptr
不是正确使用的智能指针.
在转向其他事情之前,C++是我的首选语言.这有点令人震惊,并且看到所有模式和实践都已完全改变.
我只是在声明一个变量之间的区别时有点困惑,例如:
int n;
Run Code Online (Sandbox Code Playgroud)
并使用"new"动态地将内存分配给变量,例如:
int m = new int;
Run Code Online (Sandbox Code Playgroud)
我注意到只是在处理一个简单的链表项目时,当我以节点对象的形式插入一个新值时,我必须动态创建一个新的节点对象并将所需的值附加到它,然后将其链接到我列表的其余部分.但是..在同一个函数中,我可以定义另一个节点对象,例如.NodeType*N. 并使用此指针遍历我的列表.我的问题是..当我们只是声明一个变量时,内存是不是立刻被分配了......或者有什么区别?
谢谢!
我想包装一个对std :: thread构造函数的调用(以跟踪所有运行的线程,以便我可以加入它们或做其他事情).在此示例中,t1
线程正确构造,但t2
线程不使用gcc 4.8.1.但是,在Windows(VS2012)上,它编译时没有错误,并且运行没有错误.基于此处的讨论,这似乎是gcc中的一个错误,但可以说它实际上是VS中的一个错误.这样做的正确方法是什么?
#include <iostream>
#include <thread>
class A {
public:
void foo(int n ) { std::cout << n << std::endl; }
};
template<class F, class Arg>
std::thread& wrapper(F&& f, Arg&& a)
{
std::thread* t = new std::thread(f,a,100);
return *t;
}
int main()
{
A a;
std::thread t1(&A::foo, &a, 100);
t1.join();
std::thread t2 = wrapper(&A::foo, &a);
t2.join();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是编译器错误
-bash-4.1$ make
g++ -std=c++11 main.cpp -o main
main.cpp: In function ‘int …
Run Code Online (Sandbox Code Playgroud) 我试图使用"g ++ main.cpp -c"编译下面的代码,但它给了我这个奇怪的错误..任何想法?
main.cpp: In function ‘int main()’:
main.cpp:9:17: error: invalid conversion from ‘Graph*’ to ‘int’
main.cpp:9:17: error: initializing argument 1 of ‘Graph::Graph(int)’
main.cpp:10:16: warning: deprecated conversion from string constant to ‘char*’
Run Code Online (Sandbox Code Playgroud)
这是我正在尝试编译的主要模块,下面是我在graph.hpp中的图形类
#include <iostream>
#include "graph.hpp"
using namespace std;
int main()
{
Graph g;
g = new Graph();
char* path = "graph.csv";
g.createGraph(path);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是我的Graph类
/*
* graph.hpp
*
* Created on: Jan 28, 2012
* Author: ajinkya
*/
#ifndef _GRAPH_HPP_
#define _GRAPH_HPP_
#include "street.hpp"
#include …
Run Code Online (Sandbox Code Playgroud) 我正在努力学习C++中的最佳习惯和实践,特别是围绕内存管理.通过在我的iOS应用程序中使用ARC,以及使用Java中的内置GC以及其他一些启用了GC的语言,我已经被宠坏了.
我知道你使用delete
或delete[]
解构指针.我的问题是,你如何delete
整数或基本数据类型的其他变量?
我的第一个想法是,因为delete
似乎只能使用指针,我可以这样做:
int intToDelete = 6;
delete &intToDelete;
Run Code Online (Sandbox Code Playgroud)
所以基本上,你可以在内存中创建一个指向整数的指针,并使用该指针删除整数吗?
c++ ×10
c++11 ×2
.net ×1
class ×1
constructor ×1
destructor ×1
g++ ×1
icc ×1
malloc ×1
memory-leaks ×1
new-operator ×1
pointers ×1
stdthread ×1
variables ×1