免费/删除 - 如果我不打电话给他们怎么办?

时间:2013-02-06 11:20:45

标签: c++ c memory memory-management malloc

我知道如果我没有使用delete / free释放已分配的内存,我最终会发生内存泄漏。我的问题是:如果我的程序被终止,操作系统是否会为我释放内存,即使我没有?

5 个答案:

答案 0 :(得分:5)

简而言之,是的。

映射到进程的地址空间的所有存储都将在该进程终止时返回给操作系统,即使您没有明确释放它。

答案 1 :(得分:4)

在C ++中,delete将导致被调用对象的析构函数。这个析构函数可以处理除释放内存之外的其他事情。它可能会关闭文件,减少引用计数等。因此,如果您忽略删除动态分配的对象,则无法确定可能出现的问题。

答案 2 :(得分:3)

内存是否泄漏取决于操作系统。对于大多数操作系统,一旦程序运行的进程退出操作系统,只需回收它分配给进程的内存。

还有另一个重要方面。 new导致调用类构造函数,delete导致调用析构函数。因此,如果您调用new并且从未调用delete,那么除了所谓的内存泄漏之外,在程序退出后可能存在/可能不存在,还有一个附加条件:特定类的析构函数调用一些具有 side effects 的代码,然后导致未定义的行为。

所以答案取决于你可能有:

  • 内存泄漏(取决于操作系统行为
  • 未定义的行为(取决于析构函数中的代码是否具有副作用

C ++ 11 Standard 3.8对象生存期:
第4段:

  

程序可以通过重用对象占用的存储或通过使用非平凡的析构函数显式调用类类型的对象的析构函数来结束任何对象的生命周期。对于具有非平凡析构函数的类类型的对象,程序不需要在存储之前显式调用析构函数   对象占用的对象被重用或释放;但是,如果没有显式调用析构函数或者如果没有使用delete-expression(5.3.5)来释放存储,则不应该隐式调用析构函数,并且任何依赖于副作用的程序都会产生析构函数具有未定义的行为。

答案 3 :(得分:2)

如果您不打电话delete - 将不会调用任何析构函数。如果任何析构函数关闭文件,将某些内容写入数据库等,那么这些操作将无法完成

答案 4 :(得分:1)

您的问题似乎是基于对内存如何工作的天真理解,这与现代操作系统的功能不符。术语“内存”容易混淆,你真的应该分别考虑物理内存(RAM)和虚拟内存(地址空间)。

当您致电malloc时,您会在流程中保留地址空间。如果操作系统认为这样做是明智的,那么它会使用物理RAM支持该地址空间。如果操作系统想要将该RAM用于其他目的,那就简单了。你不能阻止它。所以你不必担心RAM。操作系统非常智能,即使没有专门的进程释放,也始终将RAM放在最佳状态。

虚拟内存,仅仅是地址空间,并不稀缺。一旦您的流程终止,您的地址空间就不再存在。所以没有什么可以回归的。

只要内存无法访问,操作系统别无选择,只能将其释放。