进程内存是否在终止时被回收?

Tho*_*kow 8 c++ memory ram memory-leaks memory-management

在我的应用程序中,我基本上分配内存C++并将其排入队列以进行重新分配C#.此解除分配在后台运行并且是非确定性的,因此在极少数情况下,理论上可以在释放所有非托管内存之前退出应用程序.

如果是这种情况,那么行为(粗略地和非常简化)就像我的程序一样

int main()
{
   Foo* = new Foo();
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

我现在的问题是

  • 是程序分配的所有内存,但是当程序退出时是否自动回收解除分配,还是在重新引导之前一直存在内存泄漏?
  • 如果它被自动回收,那么是什么机制呢?

编辑: 这只是关于Windows,有些人提到这是依赖于操作系统的.

编辑2: 我不是在谈论简单地忽略我的应用程序中的所有内存泄漏,而是关于我是否需要确保在应用程序退出之前正确释放所有内存.

编辑3: 这不是关于打开文件句柄,析构函数和副作用或任何东西,这是关于将被非确定性地解除分配的内存以及在终止之前未释放内存的非常罕见的情况.

das*_*ght 5

当程序退出时,程序分配但未释放的所有内存是否都会自动回收,或者是否存在内存泄漏,直到我重新启动为止?

当进程终止时,操作系统会自动回收内存。

如果是自动回收的话,是由什么机制负责的呢?

newC++ 的内存管理器,即、delete、等后面的内存管理malloc器,从操作系统获取相对较大的内存块,并负责管理粒度更小的内存块。操作系统跟踪已分配给进程的所有内存,并在进程终止时回收它。

  • @ThomasFlinkow 这并不是它的工作原理。在您的示例代码中,“Foo”的内存被释放,但析构函数未运行。如果 `Foo` 在其析构函数中做了一些有用的事情,这将是一个问题,例如 `std::fstream` 将无法完成文件写入并产生不正确的结果。 (2认同)

Bas*_*tch 4

如果您只关心内存,则可能不需要调用delete,因为操作系统将在进程终止时销毁您的整个虚拟地址空间。考虑阅读操作系统:三篇简单文章(可免费下载)以了解有关操作系统的更多信息。

但你想避免内存泄漏,所以你最好正确清理。在某些操作系统上,您可以使用valgrind等工具来帮助检测此类泄漏(因此您不希望它们发出虚假警告)。

另请阅读有关RAII 的信息。在现实生活中,(或它使用的间接数据)的构造函数(或其他方法)Foo可能会消耗其他资源(数据库连接、打开的文件、屏幕上的窗口、守护进程、与外部服务或 Web 服务器的远程连接、机械臂等...)并且您希望正确处置它们。

考虑使用智能指针

数据结构的活跃性是整个程序的属性。我建议阅读GC 手册,至少了解垃圾收集的概念和术语(可以将其视为管理资源的一种方式,而不仅仅是原始内存)。

(实际上,这取决于很多:如果您与数百名其他程序员一起编写一百万行代码程序,那么您需要比单独编写一个小型单源文件程序更加小心;如果您编写一个神经手术机器人它与桌面应用程序不一样,等等......所以 YMMV)