避免内存泄漏

pkv*_*ash 4 c++ memory memory-leaks

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

任何完整的例子..

问候,

PKV

Mat*_* M. 11

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

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

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

第一步是避免动态内存分配:如果你不使用new,你没有任何东西需要管理 - 需要注意的是:某些库会把你的内存交给你,并期望你释放它.因此,只要有可能,请使用堆栈.

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

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

  • std::unique_ptr(C++ 0x)或者boost::scoped_ptr,万不得已std::auto_ptr.
  • boost::ptr_vector以及Boost.Pointer容器库的整个集合

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

第三步是微妙的,共享所有权的引入.它确实使对象生命周期内的所有推理变得复杂,并且引入了引用循环的风险,这有效地意味着内存泄漏.在某些情况下需要它们,但最好尽可能避免.

  • std::shared_ptr(C++ 0x)或等效(std::tr1::shared_ptr,boost::shared_ptr)
  • std::weak_ptr (C++ 0x)或同等学历

后者用于"打破"循环.然而weak_ptr,即使有关系图,很快就会很难理解在哪里引入.

编辑:

正如托比亚斯所指出的,这个成语被称为资源获取初始化(RAII),它被命名为笨拙.一个更新的术语正在出现:用于描述其子集的范围绑定资源管理(SBRM) - >将资源绑定到范围.