【发布时间】:2011-05-13 21:00:41
【问题描述】:
我不知道该怎么想……
我们有一个作为服务运行的组件。它在我的本地机器上运行得非常好,但在其他一些机器上(两台机器的 RAM 都等于 2GB)它开始在第二天和连续几天产生 bad_alloc 异常。问题是进程的内存使用量保持在大约 50Mb 的水平。另一个奇怪的事情是,通过跟踪消息,我们已经将异常本地化为从 stringstream 对象抛出,但该对象向流中插入不超过 1-2 Kb 的数据。如果这很重要,我们正在使用 STL-Port。
现在,当您遇到 bad_alloc 异常时,您认为这是内存泄漏。但是所有我们的手动分配都包装在一个智能指针中。此外,我无法理解当整个进程仅使用 ~50Mb 时 stringstream 对象是如何缺乏内存的(内存使用量每天都保持大致恒定(并且肯定不会增加)。
我不能给你代码,因为这个项目真的很大,而抛出异常的部分真的什么都不做,只是创建一个字符串流和
所以,我的问题是......当进程仅使用 2GB 中的 50Mb 内存时,如何发生内存泄漏/bad_alloc?对于可能出现的问题,您还有哪些疯狂的猜测?
在此先感谢,我知道这个问题含糊不清等,我有点绝望,我尽力解释了这个问题。
【问题讨论】:
-
@skwllsp:我简直不敢相信,当只使用 50 MB 时,内存碎片会导致分配 1~2kb 内存失败......可以吗?
-
如果这是碎片,我无法理解为什么在足够的运行时间后它不会在本地发生。似乎重现特定于另一台机器的某些特性。
-
当你说它使用只有 50Mb 时,你的意思是它在内存中的大小永远不会超过 50Mb,或者它的分配加起来不会超过 50Mb?一个小程序可以很容易地分配/释放比它在任何给定时刻使用的更多的内存,并且垃圾收集可能因机器而异。
标签: c++ memory-leaks windows-xp