【发布时间】:2012-10-02 23:19:23
【问题描述】:
我有以下情况:
Foo1 foo1* = new Foo1(...);
Foo2 foo2* = new Foo2(foo1, ...);
或
Foo1 foo1(...);
Foo2 foo2(foo1, ...);
我需要删除 Foo1 和 Foo2。如果我理解正确,我应该按照分配的相反顺序释放内存。所以我应该这样做:
delete(foo2);
delete(foo1);
但是我不能这样做,因为 foo1 在 foo2 的析构函数中被设置为 NULL。因此,当我尝试删除 foo2 时,它会尝试删除 NULL 引用并触发断言。有没有解决的办法?这里最好的解决方案是让我仍然将内存分配给堆栈,但绝对没有必要。
编辑:
看到这个帖子:Will a shared_ptr automatically free up memory?
感谢您的回复。我(显然)错了问题所在。我需要在这里使用 shared_ptr,因为我无法更改 API。
Foo1 *foo1 = new Foo1(...);
shared_ptr<Foo2> foo2(foo1);
这里的 shared_ptr 是否会处理释放 foo1 使用的内存?如果我理解正确,我不应该在 foo1 上调用 delete 正确吗?
我将作为一个单独的问题提出并链接到它。
【问题讨论】:
-
您不应该将
delete与您提供的第二段代码一起使用。如果您需要动态分配它,请使用智能指针并完全忘记删除。 -
@chris 我不能使用第二部分,因为在后台释放会触发断言,因为 Foo2 类中指向 foo1 的指针在尝试释放 foo1 的内存时为 NULL。
标签: c++ memory memory-management