1

可能重复:
指向对象的 C++ 向量指针
std::list::remove 方法是否调用每个已删除元素的析构函数?

如果我有一个 std::vector 定义为:

std::vector<Object*>* myObjects;

然后调用:

delete myObjects;

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

提前致谢

4

2 回答 2

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;

如果在他们持有的指针上调用deletes vector*delete那么你会遇到一堆麻烦(双关语),因为你会delete使用第一个delete产生未定义行为的自动变量(一件坏事)。

当您知道指针是动态分配的,或者更好地使用并且您永远不需要调用任何东西时vector,您必须自己手动迭代指针。deletestd::unique_ptrdelete

此外,您可能首先不需要指向 a 的指针vector,但我不会评判您,因为我不知道您的情况。

至于std::arrayand std::vector,您需要std::array在编译时知道您的大小,并且您不能在运行时调整它的大小,但vector没有这些限制。

于 2012-06-19T17:31:46.880 回答
1
  1. 不,你会有内存泄漏。
  2. 不,指针容器不会删除指向对象。
    • 使用 Boost,它有拥有数据的指针容器。
    • boost::ptr_vector<int>
于 2012-06-19T17:22:54.170 回答