我有一個非常小的系統,只有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