如果我在指向矢量std :: vector <object *> *的指针上调用“delete”,那么元素也会被删除吗?</object *>

时间:2012-06-19 17:18:53

标签: c++ memory allocation

  

可能重复:
  C++ Vector Pointers to Objects
  Does std::list::remove method call destructor of each removed element?   

如果我将std :: vector定义为:

std::vector<Object*>* myObjects;

然后致电:

delete myObjects;

然后还会删除myObjects中的元素吗?使用std :: array或任何其他stl容器有什么区别吗?

提前致谢

2 个答案:

答案 0 :(得分:6)

不,这就是原因。

考虑以下两种情况:

int a, b, c;

auto stackvec = new vector<int*> { &a, &b, &c };
auto heapvec  = new vector<int*> { new int, new int, new int };

delete stackvec;
delete heapvec;

如果在他们持有的指针上调用名为delete的{​​{1}}上的vector*,那么你就会陷入麻烦(双关语),因为你会delete使用第一个delete的自动变量产生未定义的行为(这是一件坏事)。

当你知道它们被动态分配时,你必须自己手动迭代deletevector指针,或者更好,使用delete并且你永远不需要调用{{1}在任何事情上。

另外,你可能首先不需要指向std::unique_ptr的指针,但我不会判断你,因为我不知道你的情况。

对于deletevector,您需要在编译时知道std::array的大小,并且无法在运行时调整大小,但std::vector已这些限制都没有。

答案 1 :(得分:1)

  1. 不,你会有内存泄漏。
  2. 不,指针容器不会删除尖头物体
    • 使用Boost,它拥有拥有数据的指针容器。
    • boost::ptr_vector<int>