删除矢量

时间:2012-12-05 19:53:19

标签: c++ memory-management vector

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

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

创建的新Obj是否已取消分配?

5 个答案:

答案 0 :(得分:10)

这一切都会发生可怕的错误。首先,在第一行上进行分配,&#34; a&#34;现在是在堆栈上(不是堆),由new语句分配的内存现在丢失,泄露,消失。

其次,重新出现同样的情况。将构造并复制Obj()。你的第二个new的记忆永远在空间和时间的深处迷失了。

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

答案 1 :(得分:5)

vector<Obj> a;
Obj o;
a.push_back(o);

注意:看不到newdelete。 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