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

C++模板类创建对象后初始化数组触发Segmentation fault问题

段错误原因及修复方案

核心原因

  • LinkedList类定义的二级指针成员Node<T> **head_ref未初始化就被解引用:构造函数执行(*head_ref) = NULL时,head_ref本身是野指针,未指向任何合法内存空间,解引用操作直接访问非法内存,属于C++未定义行为。默认构造Set对象时未触发崩溃是偶然现象,后续定义数组修改了栈内存布局后,非法访问的后果直接显现为段错误。
  • 你贴出的main函数中int a[] = {2,3}末尾缺少分号属于语法错误,不是段错误的触发原因,实际可运行的代码应该已补全该分号。

修复方案

第一步:修改LinkedList的指针设计(推荐方案)

完全没必要用二级指针存储链表头,直接改用一级指针即可,修改后的LinkedList代码如下:

template<typename T> class LinkedList{
private :
    Node<T> *head; // 二级指针改为一级指针
public :
    LinkedList(){
        head = NULL; // 直接初始化一级指针,无需解引用
    }
    void insert(T data){
        Node<T> *new_node = new Node<T>;
        new_node->setData(data);
        new_node->getNext() = head;
        head = new_node;
    }
    void printList(){
        Node<T> *current = head;
        while(current != NULL){
            cout << current -> getData() << " ";
            current = current -> getNext();
        }
    }
    Node<T> *getHead() const{
        return head;
    }
    void deleteList(){
        Node<T> *current = head;
        Node<T> *next;
        while(current != NULL){
            next = current -> getNext();
            delete current;
            current = next;
        }
        head = NULL;
    }
};

如果一定要保留二级指针设计,需要先给head_ref分配合法内存:构造函数中先执行head_ref = new Node<T>*();再赋值*head_ref = NULL,同时需要新增析构函数释放head_ref本身的内存,避免内存泄漏,该方案复杂度高不推荐。

第二步:补全Set类的输出运算符重载

你代码中cout << s1可正常运行说明你实际代码已经做了运算符重载,如果没有的话需要在Set类中补充如下代码:

friend ostream& operator<<(ostream& os, const Set& s) {
    s.l.printList();
    return os;
}

第三步:修复main函数语法

给数组定义语句补充分号:int a[] = {2,3};

内容的提问来源于stack exchange,提问作者Lê Lâm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 22:18:03