c++ - 一种编码风格能绝对保证没有内存泄漏吗?

标签 c++ memory-leaks coding-style c++14

从不使用


删除
发布

更喜欢使用

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>其中 CB 的基础.

关于c++ - 一种编码风格能绝对保证没有内存泄漏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31994420/

相关文章:

c++ - Linux 上 STL 的安全版本

c++ - 在 C++ 中复制具有多态成员的对象

c++ - 在 C++ 的 main() 函数中声明的类

Java:比较 Netbeans 中的内存堆转储

javascript - 优化Javascript函数内存泄漏

c++ - 在main()外调用一个函数

ios - AVAssetWriter 东西泄露

git - 如果 Github 中不存在自定义标签,则阻止 merge

coding-style - Lisp:从列表中删除尾随 nil 的优雅方法? (审查)

c# - 如何在代码中命名iOS相关元素?