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)
由于父类缺少虚拟析构函数,并且您正在通过基类指针(即 )删除Child对象(即test从),因此您有未定义的行为。foo()std::unique_ptr<Parent>
未定义的行为意味着任何事情都可能发生。在你的情况下,这是内存泄漏。
通过添加析构函数来修复它virtual。
struct Parent {
// ....
virtual ~Parent() {
//^^^^^^ -----> required !!
// ...
}
};
Run Code Online (Sandbox Code Playgroud)
阅读更多: