10

我正在阅读维基百科中的 mmap 并尝试这个例子http://en.wikipedia.org/wiki/Mmap#Example_of_usage。我已经用 gcc 编译了这个程序并运行了 valgrind overit。

这是 valgrind 的输出:

# valgrind a.out 
==7018== Memcheck, a memory error detector
==7018== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==7018== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==7018== Command: a.out
==7018== 
PID 7018:   anonymous string 1, zero-backed string 1
PID 7019:   anonymous string 1, zero-backed string 1
PID 7018:   anonymous string 2, zero-backed string 2
==7018== 
==7018== HEAP SUMMARY:
==7018==     in use at exit: 0 bytes in 0 blocks
==7018==   total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==7018== 
==7018== All heap blocks were freed -- no leaks are possible
==7018== 
==7018== For counts of detected and suppressed errors, rerun with: -v
==7018== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)
PID 7019:   anonymous string 2, zero-backed string 2
==7019== 
==7019== HEAP SUMMARY:
==7019==     in use at exit: 0 bytes in 0 blocks
==7019==   total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==7019== 
==7019== All heap blocks were freed -- no leaks are possible
==7019== 
==7019== For counts of detected and suppressed errors, rerun with: -v
==7019== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)

我的问题是

mmap 是否在堆上分配内存?如果不是, munmap 会做什么?

4

2 回答 2

19

在类 Unix 系统上,程序的地址空间由一个或多个虚拟内存区域组成,每个虚拟内存区域都由操作系统映射到物理内存、文件或什么都没有。

一般来说,堆是由 C 运行时创建并由 C 运行时管理的一个特定内存区域malloc(它反过来使用brksbrk系统调用来增长和缩小)。

mmap是一种创建新内存区域的方法,独立于malloc(因此独立于堆)。 munmap只是它的逆,它释放了这些区域。

于 2013-02-19T09:34:32.250 回答
7

mmapped 内存既不是堆也不是栈。它被映射到调用进程的虚拟地址空间,但它不是在堆上分配的。

于 2013-02-19T09:35:02.137 回答