Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 删除向量_C++_Memory Management_Vector - Fatal编程技术网

C++ 删除向量

C++ 删除向量,c++,memory-management,vector,C++,Memory Management,Vector,如果向量包含使用新建分配的一组元素,然后取消引用,则删除向量时是否释放这些元素的内存?例如: vector<Obj> a = *(new vector<Obj>()); a.push_back(*(new Obj())); delete &a; 向量a=*(新向量()); a、 向后推(*(新Obj()); 删除&a; 创建的新的Obj是否已解除分配?这一切都将大错特错。首先,第一行上的赋值“a”现在在堆栈上(而不是堆上),由new语句分配的内存现在丢失、泄漏

如果
向量
包含使用
新建
分配的一组元素,然后取消引用,则删除
向量
时是否释放这些元素的内存?例如:

vector<Obj> a = *(new vector<Obj>());
a.push_back(*(new Obj()));
delete &a;
向量a=*(新向量()); a、 向后推(*(新Obj()); 删除&a;
创建的新的
Obj
是否已解除分配?

这一切都将大错特错。首先,第一行上的赋值“a”现在在堆栈上(而不是堆上),由
new
语句分配的内存现在丢失、泄漏、消失

第二,同样的情况再次发生。将构造并复制Obj()。你的第二个
的记忆永远消失在时空的深处


然后尝试删除堆栈上分配的对象。这就是程序崩溃和烧毁的地方,所有的内存丢失都是无关紧要的。

否。
*(new Obj())
语句将堆分配对象的副本推送到向量中。复制的对象(在向量中)稍后会被销毁(当向量被销毁时),但是原始堆分配的Obj对象永远不会被删除(堆分配的内存也永远不会被释放)。

否;总体而言,您似乎在所有权方面遇到了一些问题。在本宣言中:

vector<Obj> a = *(new vector<Obj>());
是未定义的行为,因为您不是在删除通过
new
分配的对象,而是在删除本地对象。你的意思可能是:

vector<Obj*> a;
// ...
如果
向量
在其所有指针元素上调用了
delete
,那么当
a
被销毁(再次自动销毁)时,
x
也将被删除。由于它不是通过
new
分配的,因此这是未定义的行为。幸运的是,情况并非如此

如果希望指针向量在
向量
被销毁时自动销毁其引用,请使用
唯一\u ptr
向量:

vector<unique_ptr<Obj>> a;
a.push_back(unique_ptr(new Obj()));
向量a;
a、 向后推(唯一的(新的Obj());
向量a
部分在堆栈上分配一个空向量

=*(新向量())在堆上分配另一个空向量,并将其分配(复制)到堆栈向量。在堆上分配的内存没有引用,因此泄漏

a.push_back(*(新的Obj())
在堆上分配一个
Obj
,并将其复制到堆栈向量中。堆上分配的内存泄漏

删除&a尝试删除堆栈上分配的向量,这是一个错误

也许这就是你想要做的:

vector<Obj*>* a = new vector<Obj*>();
a.push_back(new Obj());
delete a;
vector*a=新向量();
a、 向后推(新Obj());
删除一条;
不,被推回向量的对象不会被释放,它们会被泄漏。在向量指针
a
上调用delete时,它将默认解构向量,而不涉及释放动态分配的内存

提示: 不要使用裸指针,更喜欢使用唯一\u ptr共享\u ptr

向量a;
vector<Obj> a;
Obj o;
a.push_back(o);
Obj o; a、 推回(o);

注意:视野中没有
新的
删除
。C++不是java。< /p>你已经设法把好几个火车残骸打包进了那3行……相关的:只对No.< <新>代码>说“不”。还有毒品。但是大部分是
新的
。非常可靠,除了你需要
向量a
在你的第四个代码片段中,如果你想
推送回()
一个
对象的地址到它上面。@j\U random\u黑客:谢谢,修正了。“是的,现在当你删除向量时,分配并推送到向量中的数据应该被删除。”——这句话有点含糊不清。它可以理解为在对向量调用delete之前,指示OP对向量中的对象调用delete。但是我也可以解释为,在向量上调用delete会导致所有的对象被删除。嗯,你做得不对。分配的对象不会被取消分配,它们将被泄漏。我想这就是你建议使用智能指针的原因。是的,你是对的。我现在意识到默认析构函数只会调用对象上的析构函数,而不会删除指针引用的数据。我会更正我的答案。
vector<Obj*>* a = new vector<Obj*>();
a.push_back(new Obj());
delete a;
vector<Obj> a;
Obj o;
a.push_back(o);