通过 mmap 分配的内存没有 munmap 会在进程退出或终端后导致泄漏

Mem alloced via mmap without munmap will cause leak after process exits or terminals

有通过mmap分配内存的代码

void *ret = mmap(NULL, 4 * 1024, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0);

当进程正常退出时,内存会是return到os ?

根据manunmap下:

The region is also automatically unmapped when the process is terminated.

这听起来很合理,因为内存被添加到虚拟内存中的进程页面,虚拟内存在终止时被释放。

Opengroup 未就此主题发表任何言论。

如果系统没有释放内存您可以尝试设置一个 at_exit 来清除任何仍然有效的分配内存映射,如果您能找到指向它的指针的话。

我刚刚发现了困难的方法,如果进程 没有 终止,只是 keeps 在 运行 上。 事后看来,这似乎很明显。

在连续几天调查内存泄漏时,我现在意识到我不应该完全依赖 Valgrind 来查找原因。当 Valgrind 报告根本没有泄漏时,我惊呆了,而我只能看到 ps 报告的 VSZ 部分关于我的进程稳步增加。

然后在拼命地谷歌搜索之后,最终一句话 here 让我走上了正确的轨道:

If your program is in a steady state but your VSZ keeps increasing, you have some sort of allocation leak. It may not strictly be a memory leak; you might be forgetting to unmap files or unload dynamically loaded code or something.

并且如 中明确所述,Valgrind 不报告 mmap() 泄漏。