程序的堆内存的初始大小
程序:
#include<stdio.h>
#include<sys/types.h>
#include<malloc.h>
main()
{
int *i1, *i2;
char *s;
printf("sbrk(0) before malloc(4): %xn", sbrk(0));
i1 = (int *) malloc(sizeof(int));
printf("sbrk(0) after `i1 = (int *) malloc(4)': %xn", sbrk(0));
i2 = (int *) malloc(sizeof(int));
printf("sbrk(0) after `i2 = (int *) malloc(4)': %xn", sbrk(0));
}
输出:
sbrk(0) before malloc(4): a027000
sbrk(0) after `i1 = (int *) malloc(4)': a048000
sbrk(0) after `i2 = (int *) malloc(4)': a048000
上述程序的堆内存的初始大小是多少? 我想,在程序的最初阶段,堆的开始和结束地址是相同的。 有一次,我们调用malloc,它使用sbrk分配内存。
上面的程序显示,首先sbrk(0)返回a027000作为程序中断。 malloc语句执行后,程序中断变为a048000。 它表明,在调用malloc之前,堆没有足够的内存。 因此,在调用malloc之后,只有程序中断被更改。 在初始状态下,如果堆有足够的内存,则不需要更改程序中断。 所以起初,堆的大小为零。 这样对吗?
发生什么取决于你的O / S在你的main()
被调用之前做了什么。
在Mac OS X上,调用main()
函数之前会发生大量的内存分配。 我目前有一个18个左右的“内存滥用”列表,这些都是在系统提供的启动代码调用main()
之前发生的事情。
运行一个简单的程序,每行输出一个参数,但不给出任何参数,所以没有输出,从valgrind
产生一个使用情况报告,如下所示:
==59405== Memcheck, a memory error detector
==59405== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==59405== Using Valgrind-3.11.0.SVN and LibVEX; rerun with -h for copyright info
==59405== Command: /Users/jleffler/bin/al
==59405==
--59405-- /Users/jleffler/bin/al:
--59405-- dSYM directory is missing; consider using --dsymutil=yes
--59405-- UNKNOWN mach_msg unhandled MACH_SEND_TRAILER option
--59405-- UNKNOWN mach_msg unhandled MACH_SEND_TRAILER option (repeated 2 times)
--59405-- UNKNOWN mach_msg unhandled MACH_SEND_TRAILER option (repeated 4 times)
==59405==
==59405== HEAP SUMMARY:
==59405== in use at exit: 34,808 bytes in 417 blocks
==59405== total heap usage: 517 allocs, 100 frees, 41,784 bytes allocated
==59405==
==59405== LEAK SUMMARY:
==59405== definitely lost: 16 bytes in 1 blocks
==59405== indirectly lost: 0 bytes in 0 blocks
==59405== possibly lost: 13,002 bytes in 109 blocks
==59405== still reachable: 21,790 bytes in 307 blocks
==59405== suppressed: 0 bytes in 0 blocks
==59405== Rerun with --leak-check=full to see details of leaked memory
==59405==
==59405== For counts of detected and suppressed errors, rerun with: -v
==59405== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
程序的代码?
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
if (argc > 1)
{
while (*++argv)
puts(*argv);
}
return(EXIT_SUCCESS);
}
大量的记忆活动,但没有在我写的代码中。 泄漏是我在抑制文件中记录的一个数字。
当安装glibc debuginfo时(例如在Fedora 22上: dnf debuginfo-install glibc-2.21-5.fc22.x86_64
),可以打印出main_arena
和mp_
。
使用空的int main(void)
调试程序:
mp_.sbrk_base
是堆的基础。 在我的Linux上,当main
被称为堆不存在时。 调用malloc(1000)
mp_.sbrk_base
为0x602000
。 main_arena.top
是堆顶部的空闲内存块。 它是0x6023f0
(gdb) b main
Breakpoint 1 at 0x4004fa: file test.c, line 3.
(gdb) r
Starting program: /home/m/a.out
Breakpoint 1, main () at test.c:3
3 return 0;
(gdb) p mp_
$1 = {trim_threshold = 131072, top_pad = 131072, mmap_threshold = 131072, arena_test = 8, arena_max = 0, n_mmaps = 0,
n_mmaps_max = 65536, max_n_mmaps = 0, no_dyn_threshold = 0, mmapped_mem = 0, max_mmapped_mem = 0, max_total_mem = 0,
sbrk_base = 0x0}
(gdb) p main_arena
$2 = {mutex = 0, flags = 0, fastbinsY = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, top = 0x0,
last_remainder = 0x0, bins = {0x0 <repeats 254 times>}, binmap = {0, 0, 0, 0}, next = 0x7ffff7dd6b20 <main_arena>,
next_free = 0x0, system_mem = 0, max_system_mem = 0}
(gdb) call malloc(1000)
$3 = (void *) 0x602010
(gdb) p mp_
$4 = {trim_threshold = 131072, top_pad = 131072, mmap_threshold = 131072, arena_test = 8, arena_max = 0, n_mmaps = 0,
n_mmaps_max = 65536, max_n_mmaps = 0, no_dyn_threshold = 0, mmapped_mem = 0, max_mmapped_mem = 0, max_total_mem = 0,
sbrk_base = 0x602000 ""}
(gdb) p main_arena
$5 = {mutex = 0, flags = 1, fastbinsY = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, top = 0x6023f0,
last_remainder = 0x0, bins = {0x7ffff7dd6b78 <main_arena+88>, 0x7ffff7dd6b78 <main_arena+88>, [...]
0x7ffff7dd7198 <main_arena+1656>, 0x7ffff7dd71a8 <main_arena+1672>, 0x7ffff7dd71a8 <main_arena+1672>...}, binmap = {0,
0, 0, 0}, next = 0x7ffff7dd6b20 <main_arena>, next_free = 0x0, system_mem = 135168, max_system_mem = 135168}
(gdb) call sbrk(0)
$6 = 6434816
(gdb) p (void*)$6
$7 = (void *) 0x623000
(gdb)
链接地址: http://www.djcxy.com/p/15173.html