我们如何使用重载运算符来防止 C++ 中的内存泄漏?

任何完整的例子..

问候,

PKV

最佳答案

如果您想避免内存泄漏,请不要使用 delete

这可能看起来很矛盾,但事实是手动内存管理容易出错,最好使用自动(或库)技术。

在 C++ 中,对于您创建的每个对象,都应该有明确的所有权。也就是说,您应该能够识别对象生命周期,可能取决于其他一些对象。

第一步是避免动态内存分配:如果你不使用 new ,你就没有任何东西需要管理——警告:一些库会把内存交给你,并希望你释放它。因此,只要有可能, 就会使用堆栈

通过使用 STL 容器(例如 new)而不是滚动您自己的情况,可以避免许多 std::vector<T> 的使用。

第二步是谨慎使用 new,并且总是在分配后立即将内存移交给单个所有者。这些业主包括:

  • std::unique_ptr (C++0x) 或 boost::scoped_ptr ,最后的手段 std::auto_ptr
  • boost::ptr_vectorBoost.Pointer Container
  • 的全集

    单个所有者很容易追踪,并且由于对象的生命周期与其所有者相关联,因此对象的生命周期也很容易追踪。

    第三步是微妙的一步,引入共享所有权。它确实使围绕对象生命周期的所有推理复杂化,并引入了引用循环的风险,这实际上意味着内存泄漏。在某些情况下它们是必需的,但最好尽可能避免。
  • std::shared_ptr (C++0x) 或等价物 ( std::tr1::shared_ptr , boost::shared_ptr )
  • std::weak_ptr (C++0x) 或等效的

  • 后者用于“中断”循环。然而,即使有关系图,也很难理解在何处引入 weak_ptr

    编辑:

    正如 Tobias 所指出的,这个习语被称为资源获取即初始化 (RAII),它的命名很尴尬。一个更新的术语正在出现:范围绑定(bind)资源管理 (SBRM) 来描述它的一个子集 --> 将资源绑定(bind)到一个范围。

    关于c++ - 避免内存泄漏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5387276/

    10-11 22:51
    查看更多