Следующая программа создает Объекты в одном цикле и сохраняет ссылку в векторе для последующего удаления.
Я наблюдаю необычное поведение, хотя объекты удаляются во второй итерации, getrusage дает резидентную память выше, чем при создании объектов.
Среда выполнения в Linux Kernel 3.2.0-49-generic.
#include <iostream>
#include <vector>
#include <stdio.h>
#include <mcheck.h>
#include <sys/time.h>
#include <sys/resource.h>
using namespace std;
void printUsage(string tag)
{
struct rusage usage;
getrusage(RUSAGE_SELF, &usage);
printf("%s -- Max RSS - %ld\n", tag.c_str() ,usage.ru_maxrss);
}
class MyObject
{
public:
char array[1024 * 1024];
MyObject() {};
~MyObject() {};
};int main()
{
printUsage("Starting");
vector<MyObject *> *v = new vector<MyObject *>();
for(int i = 0; i < 10000; i++)
{
MyObject * h = new MyObject();
v->push_back(h);
// The max resident value is same. usual behavior.
// delete h;
}
printUsage("After Object creation");
for(size_t i = 0; i < v->size(); i++)
{
MyObject * h = v->at(i);
delete h;
}
v->clear();
delete v;
printUsage("After Object deletion");
return 0;
}
g++ test/test.cpp -Wall -O2 -g
Starting -- Max RSS - 3060
After Object creation -- Max RSS - 41192
**After Object deletion -- Max RSS - 41380**
Я не в курсе специфики getrusage
но из быстрого гугла вроде бы отчеты Операционные системы используемые ресурсы. Как правило, библиотека времени выполнения C ++, которая управляет памятью, используемой malloc / new, будет запрашивать у ОС большой блок памяти, когда она в этом нуждается, делать запросы malloc из этого блока, а затем удерживать блок даже после того, как все Выделения освобождаются, поэтому есть возможность обработать следующий запрос без необходимости повторного запроса ОС.