C++链表类指针解引用触发段错误及头文件嵌套包含过深问题
问题修复方案
1 解决头文件嵌套过深错误
该错误由头文件无限递归引入导致,修复步骤如下:
- 删除
LinkedList.hpp中#include "LinkedList.hpp"这行代码,头文件无需引入自身 - 为
LinkedList.hpp添加头文件防卫,避免重复包含:
在文件最开头添加:
在文件最末尾添加:#ifndef LINKED_LIST_HPP #define LINKED_LIST_HPP#endif
2 解决段错误
段错误核心原因是成员变量未初始化、空指针非法访问,具体修复点:
2.1 修复LinkedList构造函数错误
当前构造函数定义了和类成员同名的局部head变量,类的head成员未被初始化,属于野指针,同时还存在内存泄漏问题,修改为:
LinkedList::LinkedList() { head = NULL; }
2.2 修复insertEdge函数空指针访问
当前do-while循环会先执行逻辑再判断指针是否为空,当head->next为NULL时,直接解引用空指针触发崩溃,修改循环逻辑:
else if(head != NULL){ cursor = head -> next; bef = head; // 先判断指针非空再执行操作 while(cursor != NULL){ if(w < cursor -> weight){ element -> next = bef -> next; bef -> next = element; return true; } bef = cursor; cursor = cursor -> next; } // 遍历结束说明到达链表末尾,直接插入 bef -> next = element; return true; }
2.3 补充潜在问题修复
- 主函数中
LinkedList * adjTbl[n];是C语言变长数组语法,不属于C++标准,建议替换为vector<LinkedList*> adjTbl(n);保证兼容性 - 主函数读取文件后直接取
textVec[0]、textVec[1],建议补充文件读取成功判断、vector长度判断,避免文件为空时触发越界访问
内容的提问来源于stack exchange,提问作者Jvhkl
相关产品推荐
相关产品推荐

