почему HeapAlloc возвращает буфер размером 0x1ff8?(проверено на XP SP3) - PullRequest
0 голосов
/ 08 марта 2012

почему оператор new возвращает 0x1ff8, когда его попросили выделить 0xA8 байтов?

0:016> u IEFRAME!CIntShcut_CreateInstance+0x3   

IEFRAME!CIntShcut_CreateInstance+0x3:    
00d6762c 8bec         mov ebp,esp             
00d6762e 56           push esi     
00d6762f 68a8000000 **push 0A8h**                  //asking for 0xA8         
00d67634 be0e000780   mov esi,8007000Eh        
00d67639 e845a0edff   call IEFRAME!operator new (00c41683)          
00d6763e 85c0         test eax,eax       
00d67640 59 pop ecx      
00d67641 7419 je IEFRAME!CIntShcut_CreateInstance+0x23 (00d6765c)    

IEFRAME!CIntShcut_CreateInstance+0x15:     
00d6763e 85c0 test eax,eax     
0:008> !heap -p -a eax    

address 00247190 found in     
_HEAP @ 150000       
HEAP_ENTRY Size Prev Flags UserPtr UserSize - state      
00246eb0 0400 0000 [01] 00246eb8 **01ff8** - (busy)        why 0x1FF8 ??

EFRAME!operator new:   
00c41683 8bff mov edi,edi       
00c41685 55 push ebp     
00c41686 8bec mov ebp,esp     
00c41688 ff7508 push dword ptr [ebp+8]     
00c4168b 6a08 push 8     
00c4168d ff153c11c300 call dword ptr [IEFRAME!imp_GetProcessHeap (00c3113c)]     
00c41693 50 push tax      
00c41694 ff153811c300 call dword ptr [IEFRAME!imp_HeapAlloc (00c31138)]    

1 Ответ

2 голосов
/ 08 марта 2012

Это размер пула памяти кучи, а не размер отдельного выделения, сделанного вашей программе (хотя запрошенный размер будет немного больше, поскольку определенные накладные расходы добавляются к каждому запрошенному блоку памяти, тем более в отладке больше).

Это потому, что дорого запрашивать память у системных вызовов для каждого выделения, поэтому вместо этого запрашиваются гораздо большие блоки, а затем распределяются по мере необходимости, пока куча не исчерпает пространство и не потребуется другое выделение системы. Куча Windows делает это путем выделения нескольких блоков по 8 байт.

См. это и это для более глубокого взгляда на кучу памяти Windows, в то время как ответ здесь подробно описывает столбцы в windbg.

...