【问题标题】:std::bad_alloc thrown when vector's push_back() is used使用向量的 push_back() 时抛出 std::bad_alloc
【发布时间】:2014-05-29 11:49:42
【问题描述】:

在下面的 sn-p 代码中,我收到一条错误消息: 在抛出 'std::bad_alloc' 的实例后调用终止 什么():std::bad_alloc 中止(核心转储)

这发生在 push_back() 指令中。可能是什么原因?该错误出现在第一次迭代本身中,所以我不认为这是因为程序过度使用了内存。我可能忽略了一些非常愚蠢的事情。请告诉我!

for(i=0; i<numsegs; i++){
    for(j=0;j<rvm->number_segs; j++){
        if(segbases[i] == rvm->segment_list[j]->ext_data_seg){
            transaction->rvm = rvm;
            transaction->tid = trans_count++;
            transaction->number_regs = 0;
            transaction->number_segs++;
            rvm->segment_list[j]->modified = 1;
            temp_seg = rvm->segment_list[j];                           
            transaction->segment_list.push_back(temp_seg);
        }
    }

}

循环最初以 numsegs = rvm->number_segs = 1 运行。

编辑: 交易结构为:

struct Trans_t{
    int tid;
    rvm_t rvm;
    int number_segs;
    int number_regs;
    vector <segment*> segment_list;
    vector <region*> region_list;   
};
typedef struct Trans_t* trans_t;

【问题讨论】:

  • transaction的类型是什么?向我们展示该类型的定义。
  • 我刚刚更新了我的帖子。交易的类型是 trans_t
  • 你如何定义transaction?你为它分配内存吗?
  • 是的。定义为:trans_t transaction = (trans_t)malloc(sizeof(trans_t));
  • 您不应该混合使用 C 和 C++。如果您真的想使用指针,请使用 trans_t transaction = new trans_t; 而不是 trans_t transaction = (trans_t)malloc(sizeof(trans_t))。但我不确定这里是否需要指针……现代 C++ 旨在避免手动内存管理。

标签: c++


【解决方案1】:

主要问题似乎在 cmets 中说明:如果确实使用 malloc 分配了 Trans_t 类型的结构(不是 POD)(正如 OP 评论的那样),那么整个程序格式错误。

由于 Trans_t::segment_list 的构造函数从未运行过,尝试将任何内容推入其中会导致崩溃或异常。在这里,传递给标准分配器的“值大小”参数很可能超过该分配器的max_size()(因为它本质上是垃圾),所以它在接收它作为参数时抛出 bad_alloc。

【讨论】:

  • 谢谢@oakad!我使用 new 分配内存并更改了结构的定义,使其不总是指针。这似乎已经解决了现在的问题。 :)
猜你喜欢
  • 2011-03-30
  • 1970-01-01
  • 2012-08-08
  • 1970-01-01
  • 2012-08-24
  • 1970-01-01
  • 2018-11-12
  • 2016-04-04
  • 1970-01-01
相关资源
最近更新 更多