В Win32 HeapFree не возвращает память

#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 в первой частной куче, и я использую другую частную кучу, то является ли это причиной нехватки памяти?