1

如果我delete是一个指针向量,是不是就delete调用里面的指针呢?例如:

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

在此之后,是否也被Obj删除?

4

5 回答 5

5

当向量被销毁时,它会销毁每个包含的元素。指针在销毁时不会做任何事情,因此内存会泄漏并且delete不会单独调用它们。

更好的解决方案是使用std::unique_ptr

vector<std::unique_ptr<Obj> >

unique_ptr将在销毁时删除它指向的对象。

于 2012-12-05T23:30:57.853 回答
4

不,不是的。如果您考虑向量的工作原理,那是有道理的。向量动态分配内存以存储其元素,然后将它们复制进去。

它不知道它的类型是什么,因此当它调用delete其内部内存存储时,它是在用于存储每个指针的内存上调用 delete ,而不是指针所指的内容。例如,如果你写了类似...

int **a = new int*[10];
for(int i = 0; i < 10; ++i)
    a[i] = new int(i);

delete [] a;

a被释放了,但是每个指针所指的内存呢?它被泄露了;您只释放了用于存储指针本身的内存。即使它确实尝试了像您要求的那样的事情,您也不会想要它。向量怎么可能知道给定指针引用的内存是否可以安全调用delete?它不能。

这就是为什么你不应该使用指针向量。相反,更喜欢智能指针向量,即

std::vector<unique_ptr<my_type>> vec;
于 2012-12-05T23:29:51.363 回答
1

不,您应该遍历向量并删除其中的元素。

于 2012-12-05T23:29:24.277 回答
0

boost 库有ptr_vector: http: //www.boost.org/doc/libs/1_52_0/libs/ptr_container/doc/ptr_vector.html
为你做这件事。

vector它本身只激活它立即包含的对象的析构函数。在这种情况下,它包含一个没有析构函数的原始 C 指针。

于 2012-12-05T23:33:23.617 回答
0

复制自 stl_vector.h 中 ~vector() 的文档:

The dtor only erases the elements, and note that if the elements themselves are pointers, the pointed-to memory is not touched in any way. Managing the pointer is the user's responsibility.

所以不行。

于 2012-12-05T23:33:44.707 回答