2011-07-14 46 views
1

我的应用程序获取bad_alloc异常。 资源监视器显示由OS(Commit)保留的虚拟内存超过了2G。 但是,进程(工作集)当前正在使用的虚拟内存非常小(在崩溃时它可能在200000 Kb左右)。 如何发生?我注意到,当程序启动时,这两个文件的大小基本相同(Commit提高一点)。但随着时间传递差异的增加,在我看来,因为当第二个内存(工作集)增加时,第一个(提交)也增加。但是当第二个减少时,第一个不会返回。 我使用三台不同的电脑,并且处处都有这种行为。我使用Windows 7,程序是用C++编写的。为什么保留的虚拟内存在当前使用的虚拟内存不增长的同时增长?

什么会导致这样的行为? 谢谢

+1

您正在分配您实际上不用于容量的大型数组。 –

回答

1

这有时是由应用程序的内存分配模式造成的。例如,如果您的数据结构始终在不断增长,并且延迟一段时间删除之前的缓冲区(那些空间不足的缓冲区),那么您可以使用堆来观察这种行为。这是因为当你的程序试图分配一个更大的内存块时,它在之前没有空间实际的缓冲区,所以它必须增加分配的堆来分配更大的块。也许之后你会删除旧的缓冲区,但堆已经增加了。也许甚至在另一个循环之后,你会使用释放的内存片段,这又不会为下一个更大的块留下足够的空间,等等,所以内存已经耗尽。

这将有助于从内存管理角度对程序的内部工作进行粗略描述。

+0

内存管理不简单,程序很大。通常在记忆管理器中,我预先分配空间并使用它的空白。但是真正奇怪的是,Commit变得比Private更大1000倍,比方说我现在看到1370528和11920. – Ivan

+0

然后不要预先分配。只分配你需要的东西*以及什么时候需要。这是一个更好的编程习惯。 –

+0

我的第一个评论当然是100。但通常当它得到bad_alloc和Commit等于2020000 Kb。私有通常是像200000 Kb – Ivan

0

“工作集”是OS为您的应用程序显示的页面数量。操作系统总是试图减少它。

如果您分配内存并且不使用它,工作集将会很小。但是,您分配的内存无论如何都必须适合应用程序的虚拟地址空间。

+0

谢谢。我只是不确定那些“工作集”和“提交”的含义。从你的回答中,我总结出这绝对是物理和虚拟内存。所以,它只是鼓励我看起来更难,我发现罪魁祸首 - 当我寻找以前的错误,我用内存管理器(分别为“删除”释放)的内存管理的帮助替换内存分配“新”。但后来,当发现错误时,我没有把所有东西都还回去。谢谢。 – Ivan

+0

啊,所以这是一个泄漏。我怀疑如此。请将其中一个答案标记为“答案”(左边的绿色复选标记)。 – 2011-07-21 12:32:43

相关问题