C++内存泄漏修复

标签 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 vector ,对吗?

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

};

问题是:

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

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

  3. fooes vertor 是否会在删除 Base 时自动删除,还是我必须手动删除该类的所有成员?

最佳答案

1) Is this a correct memory leak fix?

不,您必须遍历元素并手动删除它们。

2) Will the destructor of Base be called before the destructor of Derived, or not?

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

3) Will the fooes vector be deleted automatically while deleting Base or I must delete all members of the class manually?

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

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

对于每个 newnew[],你应该分别有一个 deletedelete[]

一个更好的替代方案是使用智能指针。

关于C++内存泄漏修复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12246060/

相关文章:

c++ - 行式叉积特征值

c++ - 如何将 WebKit 嵌入到我的 C/C++/Win32 应用程序中?

c - 2d 链表内存未结转

c++ - 实例化冲突 - 内存泄漏?

java - 噩梦般的 java 泄漏...使用循环和 jdbc

ios - Xcode 仪器 : Leaks - App crashes on launch

c++ - 将 std::wstring 转换为 const wchar_t x[]

c++ - 模板参数类型成员上的运算符 << 仅在 clang 中导致错误

c - 带有 icd 指针的 C 代码中的 Valgrind 错误

c++ - 解决将对象传递给抛出的函数时可能发生的内存泄漏