При использовании очень большого вектора векторов мы обнаружили, что часть памяти не выпущена.
#include <iostream>
#include <vector>
#include <unistd.h>
void foo()
{
std::vector<std::vector<unsigned int> > voxelToPixel;
unsigned int numElem = 1<<27;
voxelToPixel.resize( numElem );
for (unsigned int idx=0; idx < numElem; idx++)
voxelToPixel.at(idx).push_back(idx);
}
int main()
{
foo();
std::cout << "End" << std::endl;
sleep(30);
return 0;
}
Это оставляет около 4 ГБ памяти, висящей до тех пор, пока процесс не завершится.
Если мы изменим строку for
на
for (unsigned int idx=0; idx < numElem; idx++)
voxelToPixel.at(0).push_back(idx);
память освобождается.
Использование gcc-4.8
на Linux-машине. Мы использовали htop
для отслеживания использования памяти на компьютере со 100 ГБ ОЗУ. Для запуска кода вам понадобится около 8 ГБ оперативной памяти. Можете ли вы воспроизвести проблему? Любые идеи о том, почему это происходит?
EDIT:
Мы видели, что этого не происходит на Mac (с помощью gcc
или clang
). Кроме того, в linux память освобождается, если мы вызываем foo
два раза (но повторимся в третий раз).