вектор — C ++ Распределение и освобождение объектов

Следующая программа создает Объекты в одном цикле и сохраняет ссылку в векторе для последующего удаления.

Я наблюдаю необычное поведение, хотя объекты удаляются во второй итерации, 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**

-1

Решение

Я не в курсе специфики getrusage но из быстрого гугла вроде бы отчеты Операционные системы используемые ресурсы. Как правило, библиотека времени выполнения C ++, которая управляет памятью, используемой malloc / new, будет запрашивать у ОС большой блок памяти, когда она в этом нуждается, делать запросы malloc из этого блока, а затем удерживать блок даже после того, как все Выделения освобождаются, поэтому есть возможность обработать следующий запрос без необходимости повторного запроса ОС.

1

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


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