#c
#c #winapi
Вопрос:
Я протестировал HeapAlloc и HeapFree в Win32 c .
Я создал частную кучу с помощью HeapCreate(0,0,0)
.
Далее, я выделил 100 КБ с помощью HeapAlloc(_heaphandle, 0, 1024*100)
.
Объем памяти процесса увеличился примерно на 100 КБ с некоторыми накладными расходами. Я проверил память этого процесса с помощью «вкладки процесса диспетчера работы Windows».
Я выделял 100 КБ несколько раз. Итак, я получил следующий результат.
process memory : 1,312KB committed:3472, uncommitted:258048, alloced: 0
process memory : 1,420Kb committed:7544, uncommitted:151552, alloced: 102400
process memory : 1,524Kb committed:11616,uncommitted:45056, alloced: 204800
process memory : 1,632KB ............. alloced: 307200
process memory : 1,736KB ............. alloced: 409600
Затем я освободил память с помощью HeapFree(_heaphandle, 0, pointer)
.
Но память процесса не возвращает память. Мне действительно любопытно, когда процесс освободит память.
Я получил следующий результат:
process memory : 1,736KB committed:23744, uncommitted:876544, alloced: 409600
process memory : 1,736Kb committed:126152,uncommitted:876544, alloced: 307200
process memory : 1,736Kb committed:228592,uncommitted:876544, alloced: 204800
Наконец, я уничтожил частную кучу с помощью HeapDestroy(heaphandle)
.
затем вся память кучи освобождается.
Память процесса достигает начального значения 1312 КБ.
Если я использую много памяти, я обеспокоен нехваткой памяти.
Комментарии:
1. Спасибо Naveen за ответ. Я снова протестировал. Вы правы. Но я все еще неясен. Я создал другую частную кучу, подобную первому методу. Если я использую HeapAlloc со второй частной кучей, объем памяти процесса увеличивается. Однако процесс имеет достаточно освобожденной памяти внутри первой частной кучи.
Ответ №1:
Вы не будете страдать от нехватки памяти. Когда вы это сделаете HeapFree
, HeapManager может фактически не вернуть его обратно в ОС и может сохранить для будущих распределений. Поэтому, когда вы это сделаете в следующий раз, HeapAlloc
он может выделить из этой памяти.
Комментарии:
1. Спасибо Naveen за ответ. Я снова протестировал. Вы правы. Но я все еще неясен. Я создал другую частную кучу, подобную первому методу. Если я использую HeapAlloc со второй частной кучей, объем памяти процесса увеличивается. Однако процесс имеет достаточно освобожденной памяти внутри первой частной кучи.
2. Если у меня много освобожденной памяти с помощью HeapFree в первой частной куче, и я использую другую частную кучу, то является ли это причиной нехватки памяти?