0

我的一个朋友告诉我,这段代码有内存泄漏

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向量,对吧?

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

};

问题是:

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

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

  3. 删除时会fooes自动删除vertorBase还是我必须手动删除班级的所有成员?

4

3 回答 3

7

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

不,您必须遍历元素并手动操作delete它们。

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

否(假设您要删除一个Derived对象)。

3)删除 Base 时会自动删除 fooes 向量还是我必须手动删除该类的所有成员?

是与否。向量本身将被删除,因为它是自动管理的,其成员不会:

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

你应该有一个deleteand分别delete[]代表每个newnew[]

所有这一切的一个更好的选择是使用智能指针。

于 2012-09-03T10:29:46.983 回答
3

您需要遍历向量中的所有指针并在清除它们之前将其删除。向量将清除指针,但不会清除它们指向的内存,除非您自己执行或更改向量以使用 shared_ptr 之类的东西。如果您的向量是对象向量,那么您将不会发生内存泄漏,但由于元素是通过您分配的指针,new您将需要释放该内存 - 向量不会自动为您执行此操作。

于 2012-09-03T10:30:00.667 回答
1

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

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

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

于 2012-09-03T11:48:35.517 回答