关于c ++:std std :: bad_alloc

Strange std::bad_alloc

据我所知,可以引发std :: bad_alloc的原因有三个:

  • 该进程请求的内存超出了可服务的范围
  • 地址空间过于分散,无法满足对大块连续内存的请求
  • 堆管理数据结构已损坏
  • 我们有运行到std :: bad_alloc的代码,但上述原因似乎都不适用。数据结构是存储为顶点的std :: list的图形,其中每个顶点再次存储作为其一部分的边的std :: list以及一定数量的连续数据。

    对于小图(<= 100'000个顶点),该程序运行得非常好,而不管每个顶点的数据段有多大(我们可以毫无问题地分配总计40 GB的内存)。但是,如果顶点数量增加,即使在仅使用8 GB内存的实例上,也会引发std :: bad_alloc异常。

    由于在较大的块中分配更多的内存时没有问题,因此应排除上述原因1.和2.。在某些部分中,我们以容易出错的方式来处理指针,因此有可能破坏堆数据结构。但是,当在较小的实例上运行时,valgrind的memcheck报告我们的代码无缺陷,因此原因似乎也不大可能(在抛出实例时,valgrind本身会耗尽内存,因此我们无法直接检查这种情况)。

    关于此行为的原因还有什么想法,或者我们可能会进行哪些测试以进一步解决问题?

    操作系统:Fedora 19
    构建系统:使用gcc 4.8.2的cmake


    我无法对您的信息发表评论,因此将其回复。

    在Kaldi(与您的系统和gcc相同)上使用OpenFST时遇到了相同的问题。 我没有跟踪此问题的确切来源,但似乎内核3.12才是此问题。 我启动了其中一个备份内核(3.11系列之一),问题消失了。

    您可以使用:

    1
    yum list --showduplicates kernel

    查找可用的3.11内核。

    编辑:

    看来,此错误已在内核3.12.11-201和3.13+中修复

    资料来源:Bugzilla