Str*_*ker 1 c++ memory-leaks memory-management
当在程序中使用malloc并且不释放内存时,在程序运行并终止后运行该程序的计算机上会丢失吗?
这取决于操作系统(更准确地说,取决于您的特定 C 实现,它隐含地包含您的操作系统)。您需要阅读有关操作系统的更多信息,例如操作系统:三部曲教科书(可免费下载)。
在 Linux、Unix(包括 MacOSX、Android 等)、Windows 等现代操作系统上,每个进程都有自己的虚拟地址空间。当进程终止时,它的整个虚拟地址空间都会消失(包括任何“内存泄漏”)。
在实践中,malloc并free建立在管理虚拟地址空间的操作系统原语之上(在 Linux 上,这些原语是系统调用,如mmap(2) &munmap可能还有旧的sbrk(2))和分页。请注意,free通常不会向操作系统释放内存(例如使用 munmap),但更经常地将释放的内存区域标记为可由 future malloc-s重用。
但是,避免内存泄漏是一个很好的纪律(并且对于像服务器这样的长期进程至关重要)。然后,像valgrind或address sanitizers这样的工具可以帮助检测它们。
一本关于垃圾收集的好书为您提供了与内存管理相关的概念和术语。另请阅读有关RAII 的信息。想想循环引用、智能指针、弱引用等......
(在像 MS-DOS 这样的旧系统上,情况可能并非如此,但细节很重要;在某些嵌入式系统上也是如此)