HeapCreate и HeapAlloc путают

Я делаю проект по динамическому управлению памятью. Я запутался в функциях HeapCreate и HeapAlloc.

Для функции HeapCreate() мы можем создать кучу, и функция вернет HANDLE. Мы можем инициализировать размер кучи.

Допустим, winHandle = HeapCreate( 0, 2 * 1024, 0);

Затем я могу функцию HeapAlloc выделить в этой куче. Но я запутался насчет размера кучи. Я пытаюсь привести пример, я вызываю HeapAlloc( winHandle, 0, 1024) дважды в этой куче, поэтому общая сумма будет 2 * 1024. Но я все еще могу вызывать HeapAlloc много раз, не столкнувшись с ошибкой.

Допустим, я вызываю HeapAlloc( winHandle, 0, 1024) три раза. Общий размер выделения будет 3 * 1024. Это больше, чем размер кучи 2 * 1024. Но без ошибок.

Может ли кто-нибудь помочь мне ответить на этот вопрос?

Спасибо,

Вот тестовый код.

// create heap, and return a headle(id) for that heap
HANDLE winHandle = HeapCreate( 0, sizeof(Dog), sizeof(Dog) );


// allocate the heap header to that handle 
void* s = HeapAlloc( winHandle, 0, sizeof(Dog) );   
// check if the alloc is success or not
assert( 0 != s );
printf("%p \n", s);
// load the heap header data
Dog* heapHeader = new(s) Dog( 1, 2, 4);


// allocate the heap header to that handle 
void* ss = HeapAlloc( winHandle, 0, sizeof(Dog) );
// check if the alloc is success or not
assert( 0 != ss );
printf("%p \n", ss);
// load the heap header data
Dog* heapHeadder = new(ss) Dog( 1, 2, 4);

1 ответ

Решение

Ваше использование API слегка отключено:

HANDLE WINAPI HeapCreate(
    DWORD flOptions,
    SIZE_T dwInitialSize,
    SIZE_T dwMaximumSize );

Обратите внимание, что вторым параметром этого вызова является начальный размер кучи, а не ее максимальный размер. Когда вы указываете 0 для максимального размера, Windows будет пытаться зафиксировать новые страницы памяти для кучи, как только вы исчерпали исходный пул.

РЕДАКТИРОВАТЬ

Обратите внимание, что Windows округляет максимальный размер до ближайшего кратного размера системной страницы. Таким образом, фактический размер кучи может быть больше, чем вы просили. Кроме того, куча будет использовать часть этой памяти для собственного внутреннего учета. Таким образом, вы не сможете сделать одно выделение равным размеру кучи.

Другие вопросы по тегам