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

C++实现Node链表类调用AssignArray方法触发Segmentation Fault求助

问题原因
  • 构造函数无限递归:两个Node构造函数内部都执行了next = new Node,创建Node对象时会触发下一个Node的构造,无限循环调用构造函数,直接导致栈溢出。
  • 局部对象返回野指针:AssignArray方法中创建的new_node是栈上局部变量,方法执行结束后内存会被系统回收,返回的&new_node是野指针,后续访问该地址直接触发段错误。
  • 链表无合法尾节点:构造函数默认给next分配新Node对象,导致链表永远不存在值为NULL的尾节点,遍历链表时会无限访问非法内存。
  • main函数逻辑错误:调用AssignArray生成的链表头指针没有被接收,生成的链表完全无法使用,原有node1是默认构造的无效节点。
修复方案

第一步:修改Node构造函数

将next默认初始化为NULL,不要主动分配新Node对象:

Node::Node() {
    num = 0;
    next = NULL;
}

Node::Node(int new_num) {
    num = new_num;
    next = NULL;
}

第二步:修改AssignArray方法

使用new在堆上分配Node对象,保证生命周期不随函数结束销毁,建议将该方法声明为静态成员方法,无需依赖实例即可调用:

Node* Node::AssignArray(int list[], int i, int size) {
    if (i == size) {
        return NULL;
    }
    // 堆上分配节点,生命周期手动控制
    Node* new_node = new Node(list[i]);
    i++;
    new_node->setNext(AssignArray(list, i , size));
    return new_node;
}

原有setNext方法逻辑无误,无需修改。

第三步:修改main函数调用逻辑

int main() {
    int nums1[] = {1,2,3,4,5};
    int nums1_size = sizeof(nums1)/sizeof(nums1[0]);
    // 接收生成的链表头指针
    Node* head = Node::AssignArray(nums1, 0, nums1_size);
    
    // 此处可添加链表遍历/使用逻辑
    
    // 程序结束前释放链表内存,避免内存泄漏
    Node* temp;
    while(head != NULL) {
        temp = head;
        head = head->getNext(); // 需自行补充实现getNext getter方法
        delete temp;
    }
    return 0;
}
额外注意

所有用new分配的内存必须对应使用delete释放,避免长期运行场景下出现内存泄漏问题。

内容的提问来源于stack exchange,提问作者Matt B.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 03:30:00