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
相关产品推荐
相关产品推荐

