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

