我有一个非常小的系统,只有16kb的堆,没有mmap,没有交换。我使用Doug Lea的分配程序的最新版本2.8.5 ftp://g.oswego.edu/pub/misc/malloc-2.8.5.cDoug Lea分配器的奇怪malloc行为
UPDATE我做了一个小测试情况下更容易理解,看看有什么是我的问题
如果我分配8KB,释放它(!I = NULL),分配12KB,它的工作,我可以分配12 kb的:
char *i;
dlstats();
i = dlmalloc(8192);
printf("DEBUG: %p\n", i);
dlstats();
dlfree(i);
dlstats();
i = dlmalloc(12288);
printf("DEBUG: %p\n", i);
dlstats();
dlfree(i);
dlstats();
显示:
heap 0xa00003f0 sbrk 0xa00003f0 arena 0 ordblks 0 usmblks 0 uordblks 0 fordblks 0 keepcost 0
DEBUG: 0xa00003f8
heap 0xa00003f0 sbrk 0xa0002440 arena 8272 ordblks 1 usmblks 8272 uordblks 8200 fordblks 72 keepcost 32
heap 0xa00003f0 sbrk 0xa0002440 arena 8272 ordblks 1 usmblks 8272 uordblks 0 fordblks 8272 keepcost 8232
DEBUG: 0xa00003f8
heap 0xa00003f0 sbrk 0xa0003460 arena 12400 ordblks 1 usmblks 12400 uordblks 12296 fordblks 104 keepcost 64
heap 0xa00003f0 sbrk 0xa0003460 arena 12400 ordblks 1 usmblks 12400 uordblks 0 fordblks 12400 keepcost 12360
如果我第一次分配太大缓冲(30KB),然后我分配8KB,无它,配备12KB,它的工作(我== NULL),我无法分配12 KB:
char *i;
dlstats();
i = dlmalloc(30000);
printf("DEBUG: %p\n", i);
dlstats();
i = dlmalloc(8192);
printf("DEBUG: %p\n", i);
dlstats();
dlfree(i);
dlstats();
i = dlmalloc(12288);
printf("DEBUG: %p\n", i);
dlstats();
dlfree(i);
dlstats();
显示器:
heap 0xa00003f0 sbrk 0xa00003f0 arena 0 ordblks 0 usmblks 0 uordblks 0 fordblks 0 keepcost 0
DEBUG: 0x0
heap 0xa00003f0 sbrk 0xa00003f0 arena 0 ordblks 0 usmblks 0 uordblks 0 fordblks 0 keepcost 0
DEBUG: 0xa00003f8
heap 0xa00003f0 sbrk 0xa0002430 arena 8256 ordblks 1 usmblks 8256 uordblks 8200 fordblks 56 keepcost 16
heap 0xa00003f0 sbrk 0xa0002430 arena 8256 ordblks 1 usmblks 8256 uordblks 0 fordblks 8256 keepcost 8216
DEBUG: 0x0
heap 0xa00003f0 sbrk 0xa0002430 arena 8256 ordblks 1 usmblks 8256 uordblks 0 fordblks 8256 keepcost 8216
heap 0xa00003f0 sbrk 0xa0002430 arena 8256 ordblks 1 usmblks 8256 uordblks 0 fordblks 8256 keepcost 8216
在每一个时刻,只有一个已做出分配和分配之前释放另一个块所以内存不应该被割裂。
您正在循环中调用dlstats() - 您确定此调用本身不需要堆上的某些内存?您是否尝试过没有调用dlstats? – 2011-05-25 11:37:42
@Frank:dlstats没有分配内存,我尝试不调用它们,我有相同的行为 – acemtp 2011-05-25 15:00:36
我将测试用例更改为一个简单的测试用例。似乎调用malloc如果太大的尺寸会产生问题,我不明白为什么 – acemtp 2011-05-25 15:01:17