内存泄漏是永久性的吗?

时间:2018-03-29 05:15:02

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

如果在程序中使用malloc并且没有释放内存,那么在程序运行和终止后运行程序的计算机上是否会丢失它?

1 个答案:

答案 0 :(得分:4)

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

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

实际上,mallocfree是在管理虚拟地址空间的操作系统原语之上构建的(在Linux上,这些原语是system calls,如mmap(2)& {{ 1}},也许是旧sbrk(2))和paging。请注意,munmap通常不会向操作系统释放内存(例如,使用free),但更常见的是将释放的内存区域标记为将来munmap - s可重用。

但是,避免memory leaks是一个很好的规则(对于像服务器这样的长期流程来说是必不可少的)。然后,valgrindaddress sanitizers等工具可以帮助您检测它们。

book上的好garbage collection为您提供与memory management相关的概念和术语。另请阅读RAII。想一想circular referencessmart pointersweak references等......

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