У меня есть простая программа на C ++, использующая библиотеку MPRR для нескольких задач, написанную, чтобы попытаться понять проблему с памятью в более крупной программе:
int main() {
int prec=65536, size=1, newsize=1;
mpfr_t **mf;
while(true) {
size=newsize;
mf=new mpfr_t*[size];
for(int i=0;i<size;i++) {
mf[i]=new mpfr_t[size];
for(int j=0;j<size;j++) mpfr_init2(mf[i][j], prec);
}
cout << "Size of array: ";
cin >> newsize;
for(int i=0;i<size;i++) {
for(int j=0;j<size;j++) mpfr_clear(mf[i][j]);
delete [] mf[i];
}
delete [] mf;
}
}
Суть в том, чтобы объявлять массивы разных размеров и отслеживать использование памяти с помощью диспетчера задач (я использую Windows). Это прекрасно работает для размеров ~< 200, но если я объявляю что-то большее, память, кажется, не освобождается, когда я снова уменьшаю размер.
Вот пример запуска:
Я запускаю программу и выбираю размер 50. Затем я изменяю размеры между 50, 100, 150 и 200 и вижу, что использование памяти увеличивается и уменьшается, как и ожидалось. Затем я выбираю размер 250, и использование памяти возрастает, как и ожидалось, но когда я возвращаюсь к 200, оно не уменьшается, а увеличивается примерно до суммы значений памяти, необходимых для размера 200 и 250 соответственно. Подобное поведение наблюдается с большими размерами.
Есть идеи, что происходит?
Process Explorer даст вам более реалистичное представление об использовании памяти вашего процесса (виртуальный размер), чем диспетчер задач. Утечка памяти — это когда программа не освобождает память, и если это происходит постоянно, память никогда не перестанет расти.
Windows не обязательно освобождает память вашей программы обратно в саму систему — поэтому диспетчер задач и т. Д. Не скажет вам всей правды.
Для обнаружения утечек памяти в Visual Studio вы можете включить _CRTDBG_MAP_ALLOC
макрос, как описано на эта страница MSDN.
Также этот вопрос немного говорит о том, как заставить его работать с C ++ new
ключевое слово.
Других решений пока нет …