调试策略找到bad_alloc的原因

Sal*_*ami 36 c++ debugging bad-alloc

我的程序中有一个相当严重的错误 - 偶尔调用new()会抛出bad_alloc.

从我在bad_alloc上找到的文档中,似乎抛出了以下原因:

  1. 当计算机内存不足时(肯定没有发生,我有4GB的RAM,程序在使用少于5MB(在taskmanager中检查)时抛出bad_alloc,后台没有严重的运行).

  2. 如果内存变得过于分散而不能分配新的块(这也不太可能 - 我分配的最大块大小约为1KB,并且在崩溃发生之前不会超过100次).

基于这些描述,我真的没有任何可以抛出bad_alloc的地方.

但是,我运行的应用程序运行多个线程,这可能会导致问题.通过测试单个线程上的所有对象,一切似乎都顺利进行.我能想到的另一件事就是在这里发生的某种竞争条件可能是因为同时在多个地方调用new()而引起的,但我尝试添加互斥锁来防止这种行为发生没有效果.

因为该程序是几百行,我不知道问题究竟在哪里,我不知道发布的代码片段是什么(如果有的话).相反,我想知道是否有任何工具可以帮助我测试这种事情,或者是否有任何一般策略可以帮助我解决这个问题.

我正在使用Microsoft Visual Studio 2008,Poco用于线程化.

Joh*_*ler 24

当你有一个错误覆盖指针堆用来管理它用来分配的内存池时,也会抛出bad_alloc.

最常见的原因是您正在写入已分配的内存块的末尾(或者在开始之前,但这不常见).几乎一样常见的是在释放后写入内存块.这称为堆损坏.

此外,我应该注意,Windows中的32位进程最多有2GB的地址空间(3GB用于大地址感知程序).无论您安装了多少RAM,内存都是虚拟的,分配都不会失败,直到您的地址空间不足,即使您只有1GB的RAM.

以下是对C++内存损坏的一个很好的讨论http://www.eventhelix.com/RealtimeMantra/Basics/debugging_software_crashes_2.htm


Bro*_*ses 22

另一个可能的问题是,虽然你提到该程序使用的程序少于5MB,但你没有提到它试图分配多少空间.你可能会遇到一些破坏你用来确定分配大小的价值的竞争条件,它可能试图分配37TB或某些废话.

我想不太可能,但值得一试.

  • 那是我的情况......我以为我正在调用`new char[_len]`,但是当`len`尚未初始化时我正在调用`new char[len]`,所以可能是一些巨大的数字。考虑我需要多少空间并更仔细地查看这些值真的很有帮助。谢谢你的回答。 (2认同)