Does malloc() use brk() or mmap()?
malloc
is not limited to using sbrk
to allocate memory. It might, for example, use mmap
to map a large MAP_ANONYMOUS
block of memory; normally mmap
will assign a virtual address well away from the data segment.
There are other possibilities, too. In particular, malloc
, being a core part of the standard library, is not itself limited to standard library functions; it can make use of operating-system-specific interfaces.
If we change the program to see where the malloc
'd memory is:
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
void program_break_test() {
printf("%10p\n", sbrk(0));
char *bl = malloc(1024 * 1024);
printf("%10p\n", sbrk(0));
printf("malloc'd at: %10p\n", bl);
free(bl);
printf("%10p\n", sbrk(0));
}
int main(int argc, char **argv) {
program_break_test();
return 0;
}
It's perhaps a bit clearer that sbrk
wouldn't change. The memory given to us by malloc
is being mapped into a wildly different location.
You could also use strace
on Linux to see what system calls are made, and find out that malloc
is using mmap
to perform the allocation.