【发布时间】:2014-11-19 03:56:06
【问题描述】:
当使用一个非常大的向量向量时,我们发现部分内存没有被释放。
#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 两次(但第三次再次发生),内存就会被释放。
【问题讨论】:
-
你能用一个更小的例子重现这个吗?
-
@stefan 小了怎么办?元素数量?我在 2^25 看到过这种情况,但对于较小的情况很难说。