模板类变量赋值时触发段错误的问题求助
段错误原因分析与修复方案
核心错误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
相关产品推荐
相关产品推荐

