【问题标题】:__int64 vs int - Memory Managed__int64 与 int - 内存管理
【发布时间】:2009-07-31 07:32:18
【问题描述】:

我有一台 Win XP 32 位机器。我正在使用 Visual C++ 语言来测试这个场景。 我创建了一个像 vector<__int64> v 这样的向量。我记下了虚拟内存,现在说它的 400 KB。然后我在其中推入大约 500 万个整数。现在我注意到虚拟内存,它增加到大约 900 KB。现在我在向量上调用一个擦除或清除。现在我检查虚拟内存的 600 KB 。

我尝试使用 int v 的向量进行相同的场景。这次我在填充向量之前和刷新向量之后得到了确切的内存量。

为什么内存有区别?

来自 cmets: 使用 SmartHeap

【问题讨论】:

  • 不使用SmartHeap会得到什么结果?

标签: c++ memory-management


【解决方案1】:

除了回答内存并不总是释放到操作系统之外,您的测试还可能会受到以下事实的影响:从向量中擦除元素或清除向量不会减少向量分配的缓冲区大小。

为保证内存的释放,请确保您的向量超出范围,或使用临时向量:

{
    std::vector<__int64> temp;
    v.swap(temp);
}

【讨论】:

  • 很明显减少的内存只是在超出范围之后。这就是我提到的结果
【解决方案2】:

运行时不会总是将内存释放回操作系统,它会保留内存以备将来需要时使用。有时内存也相当碎片化,因此没有简单的方法将其释放回操作系统。

分配器通常会将内存保留在(大于程序分配的)块中,因此查看内存使用情况可能无法反映程序的内存分配和释放。

反正都是虚拟内存,所以没有用完机器的物理内存那么重要。

【讨论】:

  • 这很重要......因为稍后在我的应用程序中我用完了虚拟内存
  • 很公平,但 nos 的主要观点是,内存不一定会因为您已从您的控制中释放而被释放到操作系统。内存管理很复杂,而且很少像分配 X 那样简单,在你解除分配时取回 X。
  • 这些是有效点。显示潜在未释放内存的小实验可能与虚拟内存耗尽无关(这可能是某处代码中的泄漏)。
  • @qark 为什么当我摆弄普通的 int 时,我会得到确切的内存?
  • @nik 5 行代码中的内存泄漏可能是什么 int _tmain(int argc, _TCHAR* argv[]) { vector v;诠释cnt; for(cnt=0;cnt
【解决方案3】:

主要原因是内存碎片不允许运行时释放所有虚拟内存。您应该考虑使用自定义分配器进行如此大的分配。查看boost::pool_alloc,它是自定义分配器的一个非常好的实现。

使用池可以让您更好地控制程序中的内存使用方式。例如,您可能会遇到这样一种情况,您想在某个点分配一堆小对象,然后在程序中到达不再需要它们的点。使用池接口,您可以选择运行它们的析构函数或将它们丢弃;池接口将保证没有系统内存泄漏。

【讨论】:

  • 可能是SmartHeap实现问题?
【解决方案4】:

伙计们,我在这里遇到了问题。

对于 __int64 如果我首先为向量保留一些字节,然后进行插入,然后清除向量,我会恢复原始内存。然而,令我困惑的是,为什么法线向量 if int 不需要这种方法。

【讨论】:

  • 我有这个想法。如果您保留单个分配,则从堆中进行。这不会碎片化,并且清除将能够轻松释放到堆中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-13
  • 1970-01-01
  • 2013-07-11
  • 1970-01-01
  • 2011-04-08
  • 2018-12-20
  • 1970-01-01
相关资源
最近更新 更多