You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

尝试为对象属性赋值int时触发Segmentation fault问题求助

分析导致Segmentation Fault的链表插入逻辑错误

你的段错误完全是因为add函数里的指针操作逻辑混乱,最终导致你在空指针上调用了成员函数set_value_1/set_value_2,直接触发了内存访问错误。我们来一步步拆解问题:

核心错误点分析

  1. 内存泄漏 + 指针指向错误
    你一开始创建了insert_item = new list_item,但紧接着就把insert_item赋值为this->tail——这直接丢弃了刚分配的堆内存(造成内存泄漏),同时insert_item现在指向的是链表原来的尾节点(如果链表为空,这个指针就是nullptr)。

  2. 错误重置tail指针为nullptr
    你先执行this->tail = new list_item分配了新的尾节点,但马上又把this->tail赋值为this->tail->next。刚创建的list_item的next成员默认应该是nullptr(除非你在构造函数里做了特殊初始化,但从代码看没有),这直接让this->tail变成了空指针。

  3. 空指针调用成员函数
    如果是链表第一次插入元素,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:58:27