尝试为对象属性赋值int时触发Segmentation fault问题求助
分析导致Segmentation Fault的链表插入逻辑错误
你的段错误完全是因为add函数里的指针操作逻辑混乱,最终导致你在空指针上调用了成员函数set_value_1/set_value_2,直接触发了内存访问错误。我们来一步步拆解问题:
核心错误点分析
内存泄漏 + 指针指向错误
你一开始创建了insert_item = new list_item,但紧接着就把insert_item赋值为this->tail——这直接丢弃了刚分配的堆内存(造成内存泄漏),同时insert_item现在指向的是链表原来的尾节点(如果链表为空,这个指针就是nullptr)。错误重置tail指针为nullptr
你先执行this->tail = new list_item分配了新的尾节点,但马上又把this->tail赋值为this->tail->next。刚创建的list_item的next成员默认应该是nullptr(除非你在构造函数里做了特殊初始化,但从代码看没有),这直接让this->tail变成了空指针。空指针调用成员函数
如果是链表第一次插入元素,this->tail原本就是nullptr,那insert_item = this->tail后也会是nullptr。这时候调用insert_item->set_value_1(value1)就会触发段错误——因为你在尝试访问空指针指向的对象的成员,这属于非法内存访问。
修正后的尾插实现(假设链表初始时head和tail都为nullptr)
void list::add(int value1, int value2) { // 创建新节点并初始化属性 list_item* insert_item = new list_item; insert_item->set_value_1(value1); insert_item->set_value_2(value2); insert_item->next = nullptr; if (this->tail == nullptr) { // 链表为空时,头和尾都指向新节点 this->head = insert_item; this->tail = insert_item; } else { // 链表非空时,把新节点挂到原尾节点后,更新tail this->tail->next = insert_item; this->tail = insert_item; } this->size++; }
修正说明
- 先创建新节点并直接初始化它的属性,避免后续指针混乱
- 分情况处理空链表和非空链表:
- 空链表时,新节点既是头节点也是尾节点
- 非空链表时,将原尾节点的
next指向新节点,再把tail更新为新节点
- 全程没有丢失指针或错误重置为空指针,保证所有操作都在有效的对象实例上进行
内容的提问来源于stack exchange,提问作者mapawa
相关产品推荐
相关产品推荐

