我遇到了分段错误(核心转储)错误,并尝试使用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;
};
我没有以正确的方式访问结构的成员吗?请告诉我!
答案 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检查。