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) - >将资源绑定到范围.
| 归档时间: |
|
| 查看次数: |
434 次 |
| 最近记录: |