2

假设我有一个 STL 向量,其元素是指向其他类的原始指针。很明显,向量的析构函数不会释放这些指针所拥有的内存。是否可以实现释放此内存的自定义析构函数?

4

3 回答 3

6

在现代 C++ 中,使用vector<unique_ptr<T>>和所有所有权问题都是为您管理的。

如果 C++11 不可用,您可以使用shared_ptr(来自 Boost 或 TR1)而不是unique_ptr,或者您可以使用Boost 的指针容器。(不要尝试使用 deprecated auto_ptr,因为这很容易从容器中意外删除指针。大概,第一条评论指的是这个,但将它与更安全的 . 混淆了unique_ptr。)

如果由于某种原因你不能使用这些,或者如果你真的想自己做这些工作,你需要将向量包装在一个类中:

  • 一个析构函数来删除每个存储的指针;
  • 复制构造函数和复制赋值操作符,要么被删除,要么执行“深度”复制;否则,存在两个向量认为它们拥有相同对象的危险;
  • 访问器以这样一种方式读取和修改元素,即您不能在不删除其对象的情况下覆盖存储的指针。
于 2013-03-25T12:31:38.793 回答
3

不,您应该在销毁矢量之前手动清除元素。就像是

std::for_each(v.begin(), v.end(), [](const T* p) { delete p; });

或者您可以使用类似boost::ptr_vector(或一些 smart_pointers)的东西来处理这种情况。

于 2013-03-25T12:24:25.067 回答
0

您需要在删除时遍历向量并调用其中每个元素的析构函数

或者我想最好的选择是,而不是保存 A*,而是保存shared_ptr<A>,然后当没有人不再指向 A 时,它将被破坏

于 2013-03-25T12:23:18.603 回答