如果vector
包含一堆使用new
分配然后解除引用的元素,那么在删除vector
时是否会释放这些元素的内存?例如:
vector<Obj> a = *(new vector<Obj>());
a.push_back(*(new Obj()));
delete &a;
创建的新Obj
是否已取消分配?
答案 0 :(得分:10)
这一切都会发生可怕的错误。首先,在第一行上进行分配,&#34; a&#34;现在是在堆栈上(不是堆),由new
语句分配的内存现在丢失,泄露,消失。
其次,重新出现同样的情况。将构造并复制Obj()。你的第二个new
的记忆永远在空间和时间的深处迷失了。
然后尝试删除堆栈上分配的对象。这是程序崩溃和烧毁的地方,所有内存丢失都是无关紧要的。
答案 1 :(得分:5)
vector<Obj> a;
Obj o;
a.push_back(o);
注意:看不到new
或delete
。 C ++不是Java。
答案 2 :(得分:3)
没有;你似乎在一般的所有权方面遇到了一些麻烦。在本声明中:
vector<Obj> a = *(new vector<Obj>());
您正在分配新的vector
,复制它,然后丢弃原始文件。由于您不再有指向它的指针,因此无法将其删除。这称为内存泄漏。此外,这:
delete &a;
是未定义的行为,因为您没有删除通过new
分配的对象,而是删除本地的对象。你的意思是:
vector<Obj*> a;
// ...
即,分配一个名为vector<Obj>
的本地a
,当其超出范围时,其存储会自动回收。
现在对于你的实际问题,不,vector
只拥有指针,而不是它们指向的内存。考虑一下否则会发生什么:
vector<Obj*> a;
Obj x;
a.push_back(&x);
如果vector
在其所有指针元素上调用delete
,那么当a
被销毁时(再次自动),x
也将被删除。由于它未通过new
分配,因此这是未定义的行为。幸运的是,事实并非如此!
如果你想要一个指针向量,当vector
被破坏时会自动销毁它们的指示对象,使用unique_ptr
的向量:
vector<unique_ptr<Obj>> a;
a.push_back(unique_ptr(new Obj()));
答案 3 :(得分:0)
没有。 *(new Obj())
语句将(分配给)堆分配对象的副本推送到(向量中)。稍后销毁复制的对象(在向量中)(当向量被销毁时),但原始堆分配的Obj对象永远不会被删除(并且堆 - 分配的内存永远不会被释放。)
答案 4 :(得分:0)
vector<Obj> a
部分在堆栈上分配一个空向量。
= *(new vector<Obj>());
在堆上分配另一个空向量,并将其分配(复制)到堆栈向量。堆上分配的内存没有引用,并且已泄露。
a.push_back(*(new Obj()));
在堆上分配Obj
并将其复制到堆栈向量中。堆上分配的内存泄露。
delete &a;
尝试删除堆栈上分配的错误。
也许这就是你要做的事情:
vector<Obj*>* a = new vector<Obj*>();
a.push_back(new Obj());
delete a;
不然,推回到矢量中的对象将不会被释放,它们将被泄露。当在向量指针a
上调用delete时,它将默认解构向量,该向量不涉及释放动态分配的内存。
提示: 不要使用裸指针,更喜欢使用 unique_ptr 或 shared_ptr 。