удаление Visual C ++ не освобождает всю память (Windows)

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

Проблема в том, что я динамически выделяю часть памяти для двумерного массива и немедленно освобождаю ее. Тем не менее, до выделения памяти, мое использование памяти процесса 0,3 МБ до выделения, при выделении 259,6 МБ (ожидается, поскольку выделено 32768 массивов 64-битных (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;
}

5

Решение

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

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

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

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

9

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]