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

free/delete - what if I don't call them

本文关键字:打电话 怎么办 如果 删除 免费      更新时间:2023-10-16

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

简而言之,是的。

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

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

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

它还有另一个重要方面。new导致调用类构造函数,delete导致调用析构函数。因此,如果您调用了new,但从未调用过delete,那么除了所谓的内存泄漏(在程序退出后可能不存在)之外,还有一个附加条件,即如果特定类的析构函数调用了一些具有副作用的代码,则会导致Undefined Behavior。

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

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

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

程序可以通过重用对象所占用的存储,或者通过显式调用具有非平凡析构函数的类类型对象的析构函数,来结束任何对象的生存期。对于具有非平凡析构函数的类类型的对象,程序不需要在存储之前显式调用析构函数物体所占据的空间被重新使用或释放;然而,如果没有对析构函数的显式调用,或者如果没有使用删除表达式(5.3.5)来释放存储,则不应隐式调用析构函数,并且任何依赖于析构函数产生的副作用的程序都具有未定义的行为

如果不调用delete,则不会调用析构函数。如果任何析构函数关闭文件、向数据库写入内容等,则这些操作将不会完成

您的问题似乎是基于对内存如何工作的天真理解,而这与现代操作系统的工作方式不符。"内存"这个词是令人困惑的模棱两可的,你真的应该分别考虑物理内存(RAM)和虚拟内存(地址空间)。

当您调用malloc时,您会在进程中保留地址空间。如果操作系统认为这样做是明智的,它会用物理RAM来支持地址空间。如果操作系统想将RAM用于其他用途,它只需要这样做。你无法阻止它。所以你不必担心RAM。操作系统足够智能,即使进程没有专门释放RAM,也能始终将其最佳利用。

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

一旦内存无法访问,操作系统就别无选择,只能释放内存。