我有以下情况:
Foo1 foo1* = new Foo1(...);
Foo2 foo2* = new Foo2(foo1, ...);
或
Foo1 foo1(...);
Foo2 foo2(foo1, ...);
我需要删除Foo1和Foo2。如果我理解正确,我应该按照分配的相反顺序释放内存。所以我应该这样做:
delete(foo2);
delete(foo1);
但是我不能这样做,因为在foo2的析构函数中foo1被设置为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吗?
我会问一个单独的问题并链接到它。
答案 0 :(得分:7)
首先,您只需要使用delete
创建的new
个对象。一般来说,new
创建的对象没有顺序依赖性。但是,可能存在构造函数/析构函数依赖项,例如foo2在foo2的析构函数中调用foo1上的函数。在这种情况下,破坏的顺序很重要。
其次,即使foo2中的foo1指针设置为null,这只是foo2中保存的指针的本地副本。它不会影响指针的其他副本。在foo2中将foo1设置为null并不是一个坏主意,因为它表示不再使用该对象,但这与调用其析构函数或free
不同。
答案 1 :(得分:5)
我应该按照分配的相反顺序释放内存。
呃,不适用于通用分配器,例如支持new
和delete
的分配器。
但是我不能这样做,因为在foo2中foo1被设置为NULL 析构函数。
这是一堆巨大的WTF。为什么你会有这样的计划?甚至不要考虑delete
你没有new
的对象。
只需像聪明人一样使用智能指针而忘记所有这些。