4

Мне нужна помощь в понимании проблем с распределением и освобождением памяти в Windows. Я использую VS11-компилятор (VS2012 IDE) с последним обновлением на данный момент (Update 3 RC).C++ delete не освобождает всю память (Windows)

Проблема в следующем: я динамически выделяю память для двумерного массива и немедленно освобождая его. Тем не менее, до выделения памяти, мое использование памяти процесса составляет 0,3 МБ до выделения, при выделении 259,6 МБ (ожидается, что выделено 32768 массивов из 64-битных int (8 байтов)), 4106,8 МБ во время распределения, но после память освобождения не падает до ожидаемого 0,3 МБ, но застряла на 12,7 МБ. Поскольку я освобождаю всю память кучи, которую я взял, я ожидал, что память вернется к 0,3 МБ.

Это код в C++ Я использую:

#include <iostream> 
#define SIZE 32768 
int main(int argc, char* argv[]) { 
std::getchar(); 

int ** p_p_dynamic2d = new int*[SIZE]; 

for(int i=0; i<SIZE; i++){ 
    p_p_dynamic2d[i] = new int[SIZE]; 
} 
std::getchar(); 

for(int i=0; i<SIZE; i++){ 
    for(int j=0; j<SIZE; j++){ 
     p_p_dynamic2d[i][j] = j+i; 
    } 
} 

std::getchar(); 

for(int i=0; i<SIZE; i++) { 
    delete [] p_p_dynamic2d[i]; 
} 
delete [] p_p_dynamic2d; 

std::getchar(); 
return 0; 
} 
+1

Как вы решаете, что память не выпущена? Если вы используете диспетчер задач, вы получите ложную картину. Если вы запускаете отладку, вы получаете сообщение об утечке памяти? –

+0

Нет, Роджер, я использовал ТМ. Спасибо. – user2467906

ответ

7

Я уверен, что это дубликат, но я отвечу на него так или иначе:

Если вы просматриваете размер диспетчера задач , он даст вам размер этого процесса. Если нет «давления» (у вашей системы много доступной памяти, и процесс не прогоняет), нет смысла сокращать использование виртуальной памяти в процессе - для процесса роста, сжатия, роста, сжимается в циклическом шаблоне, когда он выделяет, когда он обрабатывает данные, а затем освобождает данные, используемые в одном цикле обработки, выделяя память для следующего цикла, а затем освобождая ее снова. Если ОС должна «восстановить» эти страницы памяти, только чтобы снова вернуть их к вашему процессу, это было бы пустой тратой вычислительной мощности (назначение и отрисовка страниц на конкретный процесс не является тривиальным, особенно если вы не можете точно знать, кому эти страницы принадлежат, в первую очередь, поскольку их нужно «очистить» [заполненными нулем или какой-либо другой константой, чтобы «новый владелец» не мог использовать память для « старые данные ", например, поиск моего пароля, хранящегося в памяти]).

Даже если страницы все еще остаются в собственности этого процесса, но не используются, фактическое ОЗУ может использоваться другим процессом. Так что это неважно, если страницы не были выпущены в течение некоторого времени.

Кроме того, в режиме отладки среда выполнения C++ сохранит «эта память была удалена» во всей памяти, которая проходит через delete. Это поможет определить «использование после бесплатного». Итак, если ваше приложение работает в режиме отладки, не ожидайте освобождения освобожденной памяти EVER. Он будет использоваться повторно. Поэтому, если вы запустите свой код три раза, он не будет расти в три раза больше.

+0

Спасибо, Матс, это разъясняет, что я подозреваю. – user2467906

Смежные вопросы