Я хотел бы понять, что происходит во время выполнения GCC в следующей ситуации.
У меня есть программа на C ++, которая выделяет много блоков памяти и затем удаляет их. Что удивительно, так это то, что память не возвращается операционной системе во время выполнения GCC. Вместо этого он все еще хранится в моей программе, я полагаю, на случай, если я захочу выделить подобные куски памяти в ближайшем будущем.
Следующая программа демонстрирует, что происходит:
#include <iostream>
using namespace std;
void pause1()
{
cout << "press any key and enter to continue";
char ch;
cin >> ch;
}
void allocate(int size)
{
int **array = new int*[size];
for (int c = 0; c < size; c++) {
array[c] = new int;
}
cout << "after allocation of " << size << endl;
for (int c = 0; c < size; c++) {
delete array[c];
}
delete [] array;
}
int main() {
cout << "at start" << endl;
pause1();
int size = 1000000;
for (int i = 0; i < 3; i++) {
allocate(size);
cout << "after free" << endl;
pause1();
size *= 2;
}
return 0;
}
Я проверяю объем памяти, удерживаемый процессом при каждой паузе (когда он вообще не должен удерживать память), выполняя «ps -e -o vsz, cmd».
Сумма, удерживаемая процессом при каждой паузе, равна:
2648kb - at start
18356kb - after allocating and freeing 1,000,000 ints
2780kb - after allocating and freeing 2,000,000 ints
65216kb - after allocating and freeing 4,000,000 ints
Я работаю на Fedora Core 6 и использую GCC 4.1.1.