内存泄漏而不在C ++ STL容器对象上调用clear()

时间:2015-05-22 11:09:35

标签: c++ memory-leaks stl

假设我有一个Foo类定义如下。 如果我在 ~Foo()中没有 bars.clear(),会导致内存泄漏吗? 我想知道这个因为 bars 是一个对象字段(不是指针字段)所以当调用 ~Foo()时, std :: vector的析构函数应该自动调用,所以我想知道 std :: vector 的析构函数是否会透明地调用 .clear()

    class Foo
    {
      private:
        std::vector<Bar*> bars;//object field

      ...
    };


    Foo::~Foo
    {
      //bars.clear();
    }

3 个答案:

答案 0 :(得分:3)

std::vector::clear()删除std::vector中的对象,并将其std::vector::size()更改为零。如果您创建std::vector,RAII将负责资源释放过程,但您必须等到达到向量范围之外。如果在超出范围之前,您需要清理矢量,您可以使用std::vector::clear()

但是在你的特殊情况下,你保持指向std::vector内对象的指针,因此RAII会删除指针但忽略指向指针的对象。因此,在超出范围并且RAII变为活动状态或调用std::vector::clear()之前,您必须自己清理指向指针的对象

答案 1 :(得分:2)

clear()只会将向量重置为0大小。如果向量delete中的Bar*需要删除,则不会bars任何内容,您必须执行此操作你自己。

答案 2 :(得分:-1)

如果您希望通过调用clear()方法来保护自己免受内存泄漏,那么我必须让您失望。如果你使用带指针的向量,你需要做这样的事情:

std::vector<Bar*> bars;
bars.push_back(new Bar());
// some work with bars
//  ....
// end of bars usage:
// (probably inside ~Foo() )
for(int i=0; i<bars.size(); i++) delete bars[i];

根据您的经验水平和您的具体使用情况,您可能更适合使用:

   std::vector<Bar> bars;

如果你想知道是否从向量的析构函数中调用了std :: vector&lt; ...&gt; :: clear()方法,那么答案是:可能但不一定,它确实没有&#无论如何。无论如何。

如果您真的很好奇,您可以通过查看矢量容器模板的头文件来检查容器类的析构函数。是否以及对用户可见的std库对象的实现细节有多少取决于您正在运行的系统。在工作中,我碰巧在Solaris 10机器上工作。这些机器上的std lib是Hewlett Packard anno 1994的一个实现,其中矢量模板使用的许多实际代码仍然可见:

~vector ()
{ 
  __destroy(__start, __finish); 
  __value_alloc_type va(__end_of_storage);
  va.deallocate(__start,__end_of_storage.data()-__start);
}
void clear()
{
  erase(begin(),end());
}
iterator erase (iterator first, iterator last)
{
  iterator i = copy(last, end(), first);
  iterator tmp = __finish;
  __finish = __finish - (last - first); 
  __destroy(i, tmp);
  return first;
}