c++ - 删除顺序、NULL 指针或内存泄漏

标签 c++ memory memory-management

我有以下情况:

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

我将作为一个单独的问题提出并链接到它。

最佳答案

首先,您只需要删除 使用new 创建的对象。一般来说,new创建的对象没有顺序依赖。但是,可能存在构造函数/析构函数依赖性,例如 foo2 在 foo2 的析构函数中调用 foo1 上的函数。在这种情况下,销毁顺序很重要。

其次,即使 foo2 中的 foo1 指针设置为 null,那也只是 foo2 中保存的指针的本地拷贝。它不会影响指针的其他拷贝。将 foo2 中的 foo1 设置为 null 不是一个坏主意,因为它表示不应再使用该对象,但这不同于调用其析构函数或释放它。

关于c++ - 删除顺序、NULL 指针或内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12699832/

相关文章:

c++ - 为什么从二进制存档反序列化为 std::map 时会有空间开销

java线程内存管理问题

objective-c - NSView * 实例变量的 Obj-C 内存管理

c++ - 在遍历 vector 时使用什么索引

仅适用于 Windows 的 C++ 库

c++ - boost::spirit::qi 和 boost::phoenix::push_back

采用依赖于模板参数的 std::function 的 C++11 模板函数

c++ - 如何将 Struct * 列表转换为 void * 列表?

java - Java中如何获取类的对象的引用值?

c - 在不同函数中分配的 Realloc 指针