使用唯一指针和多态性的内存泄漏

Meg*_*man 6 c++ oop memory-leaks smart-pointers unique-ptr

我知道这并std::unique_ptr不能保证内存安全,尤其是在循环依赖的情况下。然而,就我而言,我看不到它。Child包含Parent(或者SecondChild在多态性的情况下),但它们都不包含Child.

Valgrind 报告4 bytes丢失,所以我认为它SecondChild没有被破坏。我的代码确实依赖于多态性,因此我希望获得有关重构的建议,这些建议不会Parent*Child.

#include <iostream>
#include <memory>
using namespace std;

struct Parent
{
    Parent() {
        cout << "Expr created" << endl;
    }

    ~Parent() {
        cout << "Expr destroyed" << endl;
    }
};

struct Child : public Parent 
{
    std::unique_ptr<Parent> content;
};

struct SecondChild : public Parent 
{
    int val;
};

std::unique_ptr<Parent> foo()
{
    auto test = make_unique<Child>();
    auto content_in_child = make_unique<SecondChild>();
    content_in_child->val = 4;
    test->content = std::move(content_in_child);
    return test;
}

int main()
{
    std::unique_ptr<Parent> high = foo();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

JeJ*_*eJo 7

由于父类缺少虚拟析构函数,并且您正在通过基类指针(即 )删除Child对象(即test从),因此您有未定义的行为。foo()std::unique_ptr<Parent>

未定义的行为意味着任何事情都可能发生。在你的情况下,这是内存泄漏。 通过添加析构函数来修复它virtual

struct Parent {
     // ....
    virtual ~Parent() {
    //^^^^^^              -----> required !!
    // ...
    }
};
Run Code Online (Sandbox Code Playgroud)

阅读更多: