当使用非常大的向量向量时,我们发现部分内存没有被释放。
#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;
}
这意味着大约有4GB的内存会一直被占用,直到进程结束。
如果我们将for
行更改为
for (unsigned int idx=0; idx < numElem; idx++)
voxelToPixel.at(0).push_back(idx);
内存已释放。
在Linux机器上使用gcc-4.8。我们使用htop来跟踪计算机上的内存使用情况,计算机配有100 GB的RAM。您需要约8 GB的RAM才能运行代码。您是否能复现问题?关于为什么会发生这种情况,您有任何想法吗?
编辑: 我们发现在Mac(使用gcc或clang)中不会出现这种情况。此外,在Linux中,如果我们调用foo两次,内存就会被释放(但第三次再次发生)。