内存泄漏是永久性的吗?

Str*_*ker 1 c++ memory-leaks memory-management

当在程序中使用malloc并且不释放内存时,在程序运行并终止后运行该程序的计算机上会丢失吗?

Bas*_*tch 6

这取决于操作系统(更准确地说,取决于您的特定 C 实现,它隐含地包含您的操作系统)。您需要阅读有关操作系统的更多信息,例如操作系统:三部曲教科书(可免费下载)。

在 Linux、Unix(包括 MacOSX、Android 等)、Windows 等现代操作系统上,每个进程都有自己的虚拟地址空间。当进程终止时,它的整个虚拟地址空间都会消失(包括任何“内存泄漏”)。

在实践中,mallocfree建立在管理虚拟地址空间的操作系统原语之上(在 Linux 上,这些原语是系统调用,mmap(2) &munmap可能还有旧的sbrk(2))和分页。请注意,free通常不会向操作系统释放内存(例如使用 munmap),但更经常地将释放的内存区域标记为可由 future malloc-s重用。

但是,避免内存泄漏是一个很好的纪律(并且对于像服务器这样的长期进程至关重要)。然后,像valgrindaddress sanitizers这样的工具可以帮助检测它们。

关于垃圾收集的好书为您提供了与内存管理相关的概念和术语。另请阅读有关RAII 的信息。想想循环引用智能指针弱引用等......

(在像 MS-DOS 这样的旧系统上,情况可能并非如此,但细节很重要;在某些嵌入式系统上也是如此)