【问题标题】:push_back in vector fails with malloc failing to assign further memory向量中的 push_back 失败,malloc 无法分配更多内存
【发布时间】:2012-03-25 18:22:25
【问题描述】:

我有一个代码,其中对 push_back 的调用对我来说失败。 mdb 给了我以下线索。

::dem malloc+0x49~ malloc+0x49~ == malloc+0x49~ ::dem __1cIallocate4CpnGrnc_JO__6FipTA_3_+0x2a~ __1cIallocate4CpnGrnc_JO__6FipTA_3_+0x2a~ == __type_0*allocate ::dem __1cJallocator4CpnGrnc_JO__Iallocate6MI_p1_+0x20~ __1cJallocator4CpnGrnc_JO__Iallocate6MI_p1_+0x20~ == rnc_JO**allocator::allocate ::dem __1cGvector4CpnGrnc_JO__Kinsert_aux6Mp1rk1_v_+0xac __1cGvector4CpnGrnc_JO__Kinsert_aux6Mp1rk1_v_+0xac == 空向量::insert_aux ::dem __1cGvector4CpnGrnc_JO__Jpush_back6Mrk1_v_+0x4e __1cGvector4CpnGrnc_JO__Jpush_back6Mrk1_v_+0x4e == 空向量::push_back ::dem __1cIallocate4CpnGrnc_JO__6FipTA_3_+0x2a __1cIallocate4CpnGrnc_JO__6FipTA_3_+0x2a == __type_0*allocate ::dem __1cGvector4CpnGrnc_JO__Jpush_back6Mrk1_v_+0x4e __1cGvector4CpnGrnc_JO__Jpush_back6Mrk1_v_+0x4e == void vector::push_back`

我不知道如何纠正?我知道有一个分配的空间实际上大于向量大小。如果该空间被利用,它将重新分配所有数据并将其复制到第二个位置。

我还知道向量macx_size 是一个非常大的值,这对我的代码来说应该不会失败,因为我没有插入这么多值。 你能告诉我我应该调试什么吗?

【问题讨论】:

  • 您是否使用valgrind 或其他一些工具来检查内存泄漏或损坏?
  • "macx_size 是一个非常大的值,这对我的代码来说应该不会失败,因为我没有插入太多值"max_size 的值是向量可以包含的最大元素数坚持,不是最低限度。作为最低限度意味着它可以肯定地持有这些。最大意味着它肯定不能容纳更多;它可能在达到那个大小之前就失败了。
  • @BasileStarynkevitch 不,我没用过valgrind。我不知道如何使用它。
  • 创建一个大约 20 行代码的示例,重现问题。
  • @R. Martinho 我将尝试打印我的向量的 max_size 和当前大小,看看是否达到阈值

标签: c++ vector runtime-error dynamic-allocation


【解决方案1】:

这似乎是内存问题,我怀疑是在调用push_back之前列表异常。 我的建议是逐步减少对这个列表的操作,找出是哪个操作导致列表异常。

【讨论】:

    【解决方案2】:

    一种检查方法是监视系统上的可用内存以及应用程序正在使用的内存。

    • 如果您的应用程序的内存使用量不断增长,那么您可能存在内存泄漏。
    • 如果可用内存少于您的应用程序所需的内存,则说明存在资源问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-05
      • 2013-08-24
      • 2012-02-26
      • 2015-09-22
      • 1970-01-01
      • 2015-01-05
      • 2017-07-06
      • 1970-01-01
      相关资源
      最近更新 更多