如果 avector
包含一堆使用分配new
然后取消引用的元素,那么vector
删除时是否释放了这些元素的内存?例如:
vector<Obj> a = *(new vector<Obj>());
a.push_back(*(new Obj()));
delete &a;
新Obj
创建的是否已解除分配?
如果 avector
包含一堆使用分配new
然后取消引用的元素,那么vector
删除时是否释放了这些元素的内存?例如:
vector<Obj> a = *(new vector<Obj>());
a.push_back(*(new Obj()));
delete &a;
新Obj
创建的是否已解除分配?
这一切都将大错特错。首先,第一行的赋值,“a”现在在堆栈上(而不是堆上),你的new
语句分配的内存现在丢失、泄露、消失了。
其次,同样的情况再次发生。Obj() 将被构造和复制。你第二次的记忆new
永远消失在空间和时间的深处。
然后您尝试删除分配在堆栈上的对象。这是您的程序崩溃和烧毁的地方,所有这些内存丢失都是无关紧要的。
vector<Obj> a;
Obj o;
a.push_back(o);
注意:没有new
或delete
在视线范围内。C++ 不是 Java。
不; 一般来说,您似乎在所有权方面遇到了一些麻烦。在此声明中:
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()));
该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;
不,推回向量中的对象不会被释放,它们会被泄露。在向量指针上调用 delete 时,a
它将默认解构向量,这不涉及释放动态分配的内存。
提示:不要使用裸指针,最好使用unique_ptr或shared_ptr。
不。该*(new Obj())
语句将堆分配对象的副本推送(到向量中)。复制的对象(在向量中)稍后被销毁(当向量被销毁时),但原始堆分配的 Obj 对象永远不会被删除(并且堆分配的内存永远不会被释放)。