【问题标题】:When do I have to free memory?我什么时候必须释放内存?
【发布时间】:2013-01-31 12:55:00
【问题描述】:

我学习了 C#,现在我正在学习 C++。释放内存的全部意义对我来说是新的,我想知道什么时候需要担心内存释放,什么时候不需要。

据我了解,唯一需要担心内存释放的情况是我使用new运算符时,所以我应该使用delete释放内存。
但是在这些情况下不需要释放内存:

  • 类变量(成员)或静态变量。
  • 函数中的局部变量。
  • STL 系列(字符串、列表、向量等)。

这是真的吗?
还有其他情况需要我担心内存释放吗?

【问题讨论】:

  • 一个相关但切题的话题是RAII
  • 最重要的是所有权对象生命周期(在RAII之上)的概念。尤其是指针(普通和智能)和引用的可用性,您的代码应该清楚地表明哪些对象拥有哪些数据。如果您曾经在程序中使用线程,这一点尤其重要。此外,在您的测试中明智地使用 valgrind 来验证内存清洁度。

标签: c++ memory


【解决方案1】:

您基本上是对的:您需要平衡newdeletenew[]delete[],以及mallocfree

编写良好的 C++ 几乎不包含这些,因为您将动态内存和生命周期管理的责任留给合适的容器或管理器类,最值得注意的是 std::vectorstd::unique_ptr

【讨论】:

  • 请注意,由于 typedef,您使用 new 但必须使用 delete[] 的情况非常疯狂
  • @PlasmaHH:嗯,好吧,更准确地说,疯狂来自new[]中的“[]”在词汇上不在“new”这个词附近,有时它可以在完全不同的行:-)
【解决方案2】:

一般来说,我倾向于遵守以下规则:

  • 如果我编码new/new[],我会立即编码相应的delete/delete[]
  • 同样,任何malloc/calloc 后面紧跟着相关的free

这避免了许多可能导致内存泄漏的令人讨厌的情况。 如果你是 C++ 新手,我不会习惯 malloc 及其许多变体,它需要大量的脚手架才能保持类型安全,除非确实有必要,否则这可以算作 的事情,但是,如前所述,有时它是必要的:例如,当必须使用基于 C 的库/API 时,您可能需要使用它们。

基本上远离它们,你的生活会更轻松。

注意:我提到了以上几点,因为我已经从 C 转到 C++,我不得不面对 C 中许多久经考验的旧技术,这些技术会导致 C++ 出现问题。 p>

【讨论】:

  • 面对早期的returnbreak 或异常情况,您可能需要多思考一下,而不是盲目地将delete|delete[]|free 放在new|new[]|malloc 之后。即使使用它们,也可以使用std::shared_ptrstd::unique_ptr 以安全的方式管理内存。
  • 我完全同意,我并不是要暗示这些是包罗万象的修复:) 我只是说在编码每个 new|new[]|malloc|calloc 时,相关的 delete|delete[]|free 类型应该放在正确的部分代码(不是盲目的:)。关于早期的returnbreak,我的编码原则是函数只有一个退出点,所以我很少遇到这个问题,但是,是的,你是对的:关于提前终止您需要为此计划并适当删除/重新考虑函数流程并有一个返回点的函数。
  • 如果你真的进行手动清理,你应该将分配包装在try-catch 块中,毕竟,你正在调用的函数可能是throw。遗憾的是 C++ 没有 try-finally...
  • 干杯:) 我在最后一条评论中用完了字符,正在写一个附录,你打败了我:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-08
  • 2013-10-23
  • 2012-07-15
相关资源
最近更新 更多