我们如何使用重载运算符来防止 C++ 中的内存泄漏?
任何完整的例子..
问候,
PKV
最佳答案
如果您想避免内存泄漏,请不要使用 delete
。
这可能看起来很矛盾,但事实是手动内存管理容易出错,最好使用自动(或库)技术。
在 C++ 中,对于您创建的每个对象,都应该有明确的所有权。也就是说,您应该能够识别对象生命周期,可能取决于其他一些对象。
第一步是避免动态内存分配:如果你不使用 new
,你就没有任何东西需要管理——警告:一些库会把内存交给你,并希望你释放它。因此,只要有可能, 就会使用堆栈 。
通过使用 STL 容器(例如 new
)而不是滚动您自己的情况,可以避免许多 std::vector<T>
的使用。
第二步是谨慎使用 new
,并且总是在分配后立即将内存移交给单个所有者。这些业主包括:
std::unique_ptr
(C++0x) 或 boost::scoped_ptr
,最后的手段 std::auto_ptr
。 boost::ptr_vector
和 Boost.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/