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

模板类变量赋值时触发段错误的问题求助

段错误原因分析与修复方案

核心错误1:未初始化的野指针

在rear_insert函数中,你仅声明了dnode<T>* temp;但未给指针分配内存空间,这是一个野指针——它指向内存中的随机地址。当你调用temp->set_data(i)时,实际上是在修改随机内存区域的数据,必然触发段错误。

修复方法:用new创建合法的dnode实例,让指针指向有效内存:

dnode<T>* temp = new dnode<T>();

核心错误2:构造函数的成员变量名笔误

dnode的构造函数中写了data = d;,但类的私有成员变量是data_field,这是明显的变量名写错了。虽然这不是当前段错误的直接原因,但会导致构造函数无法正确初始化数据字段,引发后续逻辑问题。

修复后的构造函数(用初始化列表更规范):

dnode(T d = T(), dnode *n = nullptr, dnode *p = nullptr) 
    : data_field(d), next_field(n), previous_field(p) {}

完整修正代码

修正后的rear_insert函数

template<class T>
void dlist<T>::rear_insert(T i){
    dnode<T>* temp = new dnode<T>(); // 分配内存初始化指针
    temp->set_data(i);
    if(tail == nullptr ){
        tail = temp;
        head = temp;
    } else {
        dnode<T>* temp1 = tail;
        tail->set_next(temp);
        temp->set_previous(temp1); // 补上新节点的前驱指针,保证双向链表结构完整
        tail = temp; // 直接指向新节点,替代原代码中低效的tail = tail->next()
    }
}

修正后的dnode类

template<class T>
class dnode{
    public:
        dnode(T d = T(), dnode *n = nullptr, dnode *p = nullptr) 
            : data_field(d), next_field(n), previous_field(p) {}
        void set_data(T d){
            data_field = d;
        }
        void set_next(dnode *n){next_field = n;}
        void set_previous(dnode *p){previous_field = p;}
        T data()const {return data_field;}
        dnode* next() const {return next_field;}
        dnode* previous() {return previous_field;}

    private:
        T data_field;
        dnode* next_field;
        dnode* previous_field;
};

额外提示

  • 野指针是C++常见错误,务必保证指针使用前指向有效内存或nullptr。
  • 双向链表操作时,要同时维护节点的前驱和后继指针,避免断链。
  • 链表销毁时记得用delete逐个释放节点内存,防止内存泄漏。

内容的提问来源于stack exchange,提问作者Ancient_Spirit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 16:57:44