std::bad_alloc 在使用 vector 的 push_back() 时抛出

std::bad_alloc thrown when vector's push_back() is used

本文关键字:back push vector alloc bad std      更新时间:2023-10-16

在下面的代码片段中,我得到一个错误:在抛出"std::bad_alloc"的实例后调用terminatewhat():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;

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

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