从不使用
新
删除
发布
更喜欢使用
std::make_unique
std::unique_ptr
std::move
重置
(冗余)
应该 道德上 不会导致内存泄漏:new'ed 指针只在智能指针内部创建,它们永远无法逃脱,因为我们不允许使用 release
.
因此,人们可能会被诱惑使用这种编码风格,然后再也不会费心检查内存泄漏——无论异常可能从哪里抛出,智能指针的 RAII 语义应该总是清理任何悬空指针作为堆栈已解开。
除了 C++ 充满了令人讨厌的惊喜。根据 gotw 反复打破我的假设的经验,我不禁认为可能有一些极端情况无论如何都会导致内存泄漏。更糟糕的是,除了 release
本身,可能还有一种明显的释放指针所有权的方法。或者另一个智能指针类没有explicit
构造函数,它可能会意外摄取通过get
获得的原始指针,导致双重释放...
有没有漏洞?如果有,是否可以通过添加一些更简单的限制来解决它们? (不分配任何内存不算数!)如果可以达到一套防止所有类型内存错误的编码指南,是否可以完全忘记内存管理的细节?
最佳答案
我认为循环引用只是 std::shared_ptr
的问题...
struct X
{
std::unique_ptr<X> x;
};
void leak()
{
auto x = std::make_unique<X>();
x->x = std::move(x);
}
这可以通过确保在通过添加来自 A
的边形成的类型图中没有循环来解决。至 B
当且仅当 A
包含一个成员 std::unique_ptr<C>
其中 C
是 B
的基础.
关于c++ - 一种编码风格能绝对保证没有内存泄漏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31994420/