我有一台Win XP 32位机器。我使用Visual C ++语言来测试这种情况。 我创建了一个矢量< __ int64> v。我记下虚拟内存,现在说它是400 KB。然后我推进了大约500万个整数。现在我注意到虚拟内存,它增加到大约900 KB。现在我在向量上调用擦除或清除。现在我检查虚拟内存为600 KB。
我尝试使用int v的向量相同的场景。这次我在填充向量之前和刷新向量之前得到了确切的内存量。
为什么内存之间存在差异?
来自评论: SmartHeap已被使用。
答案 0 :(得分:3)
除了回答内存并不总是发布到操作系统之外,您的测试也可能受到以下事实的影响:从向量中删除元素或清除向量不会减小向量分配的缓冲区大小。
要保证释放内存,请确保您的矢量超出范围,或使用临时矢量:
{
std::vector<__int64> temp;
v.swap(temp);
}
答案 1 :(得分:2)
运行时不会总是将内存释放回操作系统,它会保留内存以备将来需要时使用。有时内存也相当分散,因此没有简单的方法将其释放回操作系统。
分配器通常会保留内存(大于程序分配的内存)块,因此查看内存使用情况可能无法反映内存分配和程序的重新分配。
无论如何它都是虚拟内存,所以它与耗尽机器的物理内存无关。
答案 2 :(得分:0)
主要原因是内存碎片不允许运行时释放所有虚拟内存。您应该考虑将自定义分配器用于此类大型分配。查看boost::pool_alloc作为自定义分配器的一个非常好的实现。
使用池可以更好地控制程序中内存的使用方式。例如,您可能希望在一个点上分配一堆小对象,然后到达程序中的某个点,不再需要它们。使用池接口,您可以选择运行它们的析构函数,或者只是将其删除为遗忘;池接口将保证没有系统内存泄漏。
答案 3 :(得分:0)
伙计们,我在这里得到了这个问题。
对于__int64 如果我首先为矢量保留一些字节然后进行插入然后清除矢量我得到原始存储器。然而,令人困惑的是,为什么这种方法对于正常向量(如果int)不是必需的。