我正在上大学的操作系统课程,我们的任务之一是使用mmap实现简单的malloc。现在我已经开始工作了,我试着使用val差制来检测任何剩余的bug。不管有没有释放记忆,瓦伦奇没有看到任何记忆泄漏。作为一个例子,请考虑使用以下C代码:
int main()
{
int psize = getpagesize(),i;
int *ptr = mmap(NULL, psize, PROT_WRITE | PROT_READ, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
for(i = 0; i < psize/4; i++) ptr[i] = i;
for(i = 0; i < psize/4; i++) printf("%d\n", ptr[i]);
return 0;
}让我们和gcc一起编译,然后用val研读。以下是瓦兰的回报:
==17841== Memcheck, a memory error detector
==17841== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al.
==17841== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info
==17841== Command: ./test
==17841==
------------ printing numbers from 0 to 1023
==17841==
==17841== HEAP SUMMARY:
==17841== in use at exit: 0 bytes in 0 blocks
==17841== total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==17841==
==17841== All heap blocks were freed -- no leaks are possible
==17841==
==17841== For counts of detected and suppressed errors, rerun with: -v
==17841== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)这是一件意想不到的事情,我们通常希望页面在退出程序之前被取消映射,以看到这样的消息。
起初,我认为页面可能是懒散地映射的,这就是为什么我强制在页面上执行一些操作,比如更改值,并打印它们,但正如我们所看到的,这不是问题。
这可能是我对mmap和valgrind工作原理的理解出了问题。
发布于 2015-02-18 09:08:24
mmap不会增加堆大小
堆与从mmap获得的内存是分开的。Unix进程获得内存的基本方式有两种:
brk(2)/sbrk(2)增加“中断”--这就是堆mmap在内存中进行映射--它们与堆无关记忆程序的剖析有一个很好的图片:

这可能是我对mmap和valgrind工作原理的理解出了问题。
阅读模件检查手册可能会有所帮助,特别是关于自定义分配器的部分。它的要点是,为了进行泄漏检查,mmap-allocated块对于val研来说是不可见的。它只截获malloc、calloc、free、new等。
令人困惑的是,一些mmap-allocated areas 是由valgrind跟踪的!例如,当malloc选择mmap内存而不是使用堆时,就会发生这种情况。
https://stackoverflow.com/questions/28251833
复制相似问题