如果我delete
指针向量,是否在其中的指针上调用了delete
?例如:
vector<Obj *> v = new vector<Obj *>();
v.push_back(new Obj());
delete v;
在此之后,Obj
也被删除了吗?
答案 0 :(得分:5)
当矢量被破坏时,它会破坏每个包含的元素。指针在销毁时不会执行任何操作,因此内存泄漏并且不会单独调用delete
。
更好的解决方案是使用std::unique_ptr
vector<std::unique_ptr<Obj> >
unique_ptr
将删除它在销毁时指向的对象。
答案 1 :(得分: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;
答案 2 :(得分:1)
不,你应该遍历向量并删除其中的元素。
答案 3 :(得分:0)
加强库有ptr_vector
:http://www.boost.org/doc/libs/1_52_0/libs/ptr_container/doc/ptr_vector.html
对你来说就是这样。
vector
本身只激活它立即包含的对象的描述符。在这种情况下,它包含一个没有destroctor的原始C指针。
答案 4 :(得分: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.
所以,不。