C ++内存泄漏修复

时间:2012-09-03 10:27:35

标签: c++ memory memory-leaks derived-class

我的一位队友告诉我,我的代码中有内存泄漏

Base
{
    public:
        vector<Foo*> fooes;
};

Derived : public Base
{
    public:

        Derived ( )
        {
            for ( int i = 0 ; i < 10 ; i++ )
            {
                    this.fooes.push_back ( new Foo() );
            }
        };

};

但他是一个非常忙碌的人,他无法帮助我,所以我问你,内存泄漏在哪里?我该如何解决? 据我了解,内存泄漏是我不删除由new Foo()创建的对象,所以我只能向Base添加析构函数,并清除fooes向量,对吧? / p>

Base
{
    public:
        vector<Foo*> fooes;
        ~Base ( )
        {
            this->fooes.clear();
        };

};

问题是:

  1. 这是正确的内存泄漏修复吗?

  2. 在Derived的析构函数之前是否会调用Base的析构函数?

  3. 删除fooes时是否会自动删除Base垂直或我必须手动删除该班级的所有成员?

3 个答案:

答案 0 :(得分:7)

  

1)这是正确的内存泄漏修复吗?

不,你必须遍历元素并手动delete它们。

  

2)在Derived的析构函数之前是否会调用Base的析构函数?

否(假设您正在删除Derived个对象)。

  

3)删除Base时是否会自动删除foos vector,或者我必须手动删除该类的所有成员?

是&amp;没有。矢量本身将被删除,因为它是自动管理的,其成员不会:

~Base ( )
{
   for ( size_t i = 0 ; i < fooes.size() ; i++ )
     delete fooes[i];
};

每个deletedelete[]分别应该有newnew[]

更好的替代方法是使用智能指针。

答案 1 :(得分:3)

您需要迭代向量中的所有指针并在清除之前删除它们。向量将清除指针,但它不会清除它们指向的内存,除非您自己执行或更改向量以使用类似shared_ptr的内容。如果你的向量是一个对象的向量,那么你就不会有内存泄漏,但由于这些元素是通过new分配的指针,你需要释放那个内存 - 向量不会自动执行它你。

答案 2 :(得分:1)

代码示例中没有内存泄漏,只是类定义。如果程序创建类型为Derived的对象并将其销毁,则可能(见下文)是内存泄漏。但是,如果程序创建类型为Derived的对象,则销毁它所拥有的所有Foo个对象,然后删除原始对象,可能不会有内存泄漏。

内存泄漏很少能单独分析;它们是整个程序的属性。可以修改此类以删除Foo个对象,但这可能会产生一个新的设计约束,而这个约束并非意图。例如,Foo对象可能会在内部容器中注册自己,并要求所有此类对象一直持续到程序结束;鉴于该要求,删除Derived的析构函数中的对象是错误的。

现在,这一切都很大程度上是假设的;我不会抱怨有人在增强Derived的析构函数来删除所有Foo个对象 - 这可能是正确的做法。但总有一点疑问......