-1

如果 avector包含一堆使用分配new然后取消引用的元素,那么vector删除时是否释放了这些元素的内存?例如:

vector<Obj> a = *(new vector<Obj>());
a.push_back(*(new Obj()));
delete &a;

Obj创建的是否已解除分配?

4

5 回答 5

10

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

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

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

于 2012-12-05T19:57:34.747 回答
5
vector<Obj> a;
Obj o;
a.push_back(o);

注意:没有newdelete在视线范围内。C++ 不是 Java。

于 2012-12-05T20:22:12.000 回答
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()));
于 2012-12-05T20:03:06.670 回答
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;

不,推回向量中的对象不会被释放,它们会被泄露。在向量指针上调用 delete 时,a它​​将默认解构向量,这不涉及释放动态分配的内存。

提示:不要使用裸指针,最好使用unique_ptrshared_ptr

于 2012-12-05T20:05:13.977 回答
0

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

于 2012-12-05T19:58:23.027 回答