分段错误(核心转储) - 通过对象访问结构的成员时

时间:2013-11-12 18:17:30

标签: c++ segmentation-fault

我遇到了分段错误(核心转储)错误,并尝试使用gdb进行调试。我发现了错误发生的地方:

Program received signal SIGSEGV, Segmentation fault.
0x08048edb in state_update2 () at xxx.cpp:333
333     if (rob.head->is_complete == 1 && rob.head->ready_to_retire == 1 )

代码的几行是:

    if(rob.head->is_complete == 1 && rob.head->ready_to_retire == 1) {
        reorder_buffer_node *temp = new reorder_buffer_node[sizeof(struct reorder_buffer_node)];
        temp = rob.head;
        for(uint64_t i=0; i<f_; i++) {
            if(temp->is_complete == 1 && temp->ready_to_retire == 1) {
            rob.pop();
            retired_inst++;
            temp = temp->next;
            }
            else break;
        }
    }

ROB是循环队列,head是指向结构的指针:

struct reorder_buffer_node {
    int is_complete;  
    uint64_t instr_num;
    uint64_t dest_reg;
    uint64_t index;
    reorder_buffer_node *next;
    int ready_to_retire;
};

我没有以正确的方式访问结构的成员吗?请告诉我!

3 个答案:

答案 0 :(得分:2)

reorder_buffer_node *temp = new reorder_buffer_node[sizeof(struct reorder_buffer_node)]; 

//您是否正在尝试创建reorder_buffer_node数组并命名为temp ??

temp = rob.head;

//通过上述评论,此行不会发生

temp = temp->next;

//你没有为结构编写任何构造函数,因此使用默认构造函数,temp将被分配给garbage或NULL。执行上述步骤时,可能会出现分段错误或崩溃。编写构造函数更好。

如果以下步骤得到处理,它将正确运行。

答案 1 :(得分:1)

我没有足够的背景来肯定地说,但我会从这两行开始:

reorder_buffer_node *temp = new reorder_buffer_node[sizeof(struct reorder_buffer_node)];
temp = rob.head;

以类似于:

的方式破坏new的值
int temp = 15;
temp = 5;

答案 2 :(得分:0)

如果我理解你正确崩溃发生在if()?所以,正如你所提到的那样,head是一个指针,那么也许它没有被分配?如果是这样,下面的代码给出了分段错误:

if(rob.head->is_complete == 1 && rob.head->ready_to_retire == 1)

要检查它,您只需打印指针或为此指针添加NULL检查。