通过mmap分配的不带munmap的内存将在进程退出或终止后导致泄漏

问题描述 投票:1回答:2

存在有关通过mmap分配mem的代码

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

当进程正常退出时,内存将返回到os吗?

c linux gcc memory-leaks mmap
2个回答
4
投票

根据man和在unmap下:

当执行以下操作时,该区域也会自动取消映射 已终止。

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

Opengroup没说什么。

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


0
投票

我刚刚发现很难,没有进程[[munmap()的mmap()也会导致泄漏,如果进程不是终止,但会继续运行。事后看来,这似乎很明显。

虽然连续几天调查内存泄漏,但我现在意识到我不应该完全依靠Valgrind来找到原因。当Valgrind报告根本没有泄漏时,我感到非常震惊,而我只能看到

ps报告的VSZ部分关于我的过程稳定增长的消息。

然后在拼命地进一步搜寻之后,最终的言论here使我走上了正确的轨道:

如果您的程序处于稳定状态,但您的VSZ不断增加,则可能会出现某种分配泄漏。严格来说,这可能不是内存泄漏;您可能会忘记取消映射文件或卸载动态加载的代码或其他内容。

并且正如this SO topic中明确指出的那样,Valgrind不会报告

mmap()

泄漏。
© www.soinside.com 2019 - 2024. All rights reserved.