STL容器中的自定义析构函数

时间:2013-03-25 12:22:06

标签: c++ stl

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

3 个答案:

答案 0 :(得分:4)

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

如果C ++ 11不可用,您可以使用shared_ptr(来自Boost或TR1)而不是unique_ptr,或者您可以使用Boost's pointer containers。 (不要试图使用已弃用的auto_ptr,因为这使得从容器中意外删除指针太容易了。据推测,第一条评论指的是这一点,但是它与更安全的{{ 1}}。)

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

  • 用于删除每个存储指针的析构函数;
  • 复制构造函数和复制赋值运算符,删除或执行“深度”复制;否则,有两个向量认为他们拥有相同对象的危险;
  • 读取和修改元素的访问器,使您无法在不删除其对象的情况下覆盖存储的指针。

答案 1 :(得分:3)

没有。在销毁向量之前,您应该手动清除元素。像

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

或者你可以使用boost::ptr_vector(或一些smart_pointers)来处理这种情况。

答案 2 :(得分:0)

你需要在删除时迭代向量并调用其中每个元素的析构函数

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