C 通过mmap分配的Mem(无munmap)将在工艺出口或终端后导致泄漏

C 通过mmap分配的Mem(无munmap)将在工艺出口或终端后导致泄漏,c,linux,gcc,memory-leaks,mmap,C,Linux,Gcc,Memory Leaks,Mmap,有关于通过mmap分配内存的代码 void*ret=mmap(NULL,4*1024,PROT_READ | PROT_WRITE,MAP_PRIVATE | MAP_ANON,-1,0) 当进程正常退出时,内存将根据和在取消映射下返回操作系统?: 当进程启动时,区域也会自动取消映射 终止 这听起来非常合理,因为内存被添加到虚拟内存中的进程页中,虚拟内存在终止时被释放 对这个问题什么也没说 如果系统没有释放内存,您可以尝试设置一个at_exit up,以清除任何仍然分配的memmaps,如果您可

有关于通过mmap分配内存的代码

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

当进程正常退出时,内存将根据和在
取消映射下返回操作系统?

当进程启动时,区域也会自动取消映射 终止

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

对这个问题什么也没说


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

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

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

然后,在绝望地继续搜索之后,一句话最终让我走上了正确的轨道:

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


如中所述,Valgrind没有报告mmap()泄漏。

您能提供更多关于操作系统、编译器和语言的信息吗?操作系统:Linux编译器:gcc语言:cYou刚刚挽救了这一天。