我什么时候才能释放内存? 我学会了C语言,现在我正在学习C++。释放内存对我来说是全新的,我想知道什么时候需要担心内存释放,什么时候不需要担心

我什么时候才能释放内存? 我学会了C语言,现在我正在学习C++。释放内存对我来说是全新的,我想知道什么时候需要担心内存释放,什么时候不需要担心,c++,memory,C++,Memory,据我所知,唯一需要担心内存释放的情况是当我使用new操作符时,因此我应该使用delete来释放内存 但在这些情况下,无需释放内存: 类变量(成员)或静态变量 函数中的局部变量 STL系列(字符串、列表、向量等) 这是真的吗? 还有其他情况下我需要担心内存释放吗?你基本上是对的:你需要平衡新建与删除,新建[]与删除[],以及malloc与免费 良好的编写C++几乎不包含这些,因为您将动态备忘录和寿命管理的责任留给合适的容器或管理类,最显著的是“代码> STD::向量和 STD::UNIQUIG

据我所知,唯一需要担心内存释放的情况是当我使用
new
操作符时,因此我应该使用
delete
来释放内存
但在这些情况下,无需释放内存:

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

还有其他情况下我需要担心内存释放吗?

你基本上是对的:你需要平衡
新建
删除
新建[]
删除[]
,以及
malloc
免费


良好的编写C++几乎不包含这些,因为您将动态备忘录和寿命管理的责任留给合适的容器或管理类,最显著的是“代码> STD::向量<胡/代码>和 STD::UNIQUIGYPTR < < /P> < P>作为一般的经验法则,我倾向于遵守以下:

  • 如果我对一个
    new/new[]
    进行编码,我会立即对相应的
    delete/delete[]
  • 同样,任何
    malloc/calloc
    后面紧跟着相关的
    free
这避免了许多可能产生内存泄漏的恶劣情况。 如果C++是新的,我将不习惯使用<代码> MalOC/及其许多变体,它需要很多的脚手架来保持类型安全,除非真正必要,否则可以被认为是<强>坏处>强>事物,然而,正如所提到的,有时是必要的:例如,当必须使用基于C的库/API时,您可能需要使用它们

总的来说,远离他们,你的生活就会轻松得多


<强>注:我提到了上面的点,从C到C++,我不得不面对很多来自C的老的尝试和测试的技术,这导致C++中的问题。

注意到有什么疯狂的情况,因为你使用的代码是<代码>新< /Cord>,但是必须使用<代码>删除[]/Cord>@ PrimaHh:嗯,更准确地说,这种疯狂来自于这样一个事实:
new[]
中的“
[]
”在词汇上与“
new
”一词并不相近,有时它可能位于一条完全不同的线上:-)一个相关但切题的主题是。最重要的是所有权和对象生命周期的概念(在RAII之上)。特别是在指针(普通和智能)和引用可用的情况下,您的代码应该非常清楚哪些对象拥有哪些数据。如果在程序中使用线程,这一点尤其重要。此外,在测试中明智地使用valgrind来验证内存清洁度。面对早期的
返回
中断
或异常,您可能需要更多的思考,而不仅仅是在
新建|新建| | malloc
之后盲目地添加一个
删除|删除|释放
。即使您使用它们,您也可以使用
std::shared_ptr
std::unique_ptr
以安全的方式管理内存。我完全同意,我并不是说这些都是包罗万象的修复方法:)我只是说,在编写每个
new | new[]malloc | calloc
相关的
delete | delete[]|free
类型应该放在代码的正确部分(而不是盲目地:)。对于早期的
返回
中断
I代码,其原则是一个函数只有一个退出点,因此我很少遇到这个问题,是的,你是对的:关于函数的提前终止,你需要对此进行计划,并适当地删除/重新考虑函数的流程&有一个返回点。如果你真的进行手动清理,你应该将分配包装在一个
try catch
块中,毕竟,您正在调用的函数可能会抛出。可悲的是,C++没有“代码>尝试最后
……欢呼:”我在最后一个评论中用完了字符,并在写补遗,你把我打败了: