C++ LinkedList链表googletest单元测试运行返回段错误问题排查
问题根因分析
1. 新增节点函数未分配内存,产生野指针
addNewNode函数仅声明了LinkedList *newNode指针,未调用new申请堆内存,属于未初始化的野指针,直接对其成员赋值属于非法内存访问,是典型的未定义行为,恰好运行时未立刻崩溃才出现测试用例看似通过的假象。
修正方案:补充内存分配逻辑
LinkedList* addNewNode(int nodeVal){ // 新增堆内存申请 LinkedList *newNode = new LinkedList(); newNode->value = nodeVal; newNode->nextNode = nullptr; return newNode; }
2. 单元测试断言逻辑写反
你的校验规则要求返回节点的nextNode必须为NULL,但测试用例中写的是EXPECT_TRUE(linkedlist->nextNode != nullptr);,和需求完全相反,修正为:
// 符合需求的断言,判断nextNode为空 EXPECT_TRUE(linkedlist->nextNode == nullptr);
3. 测试类存在非法释放问题
你在LinkedListTest类定义时就给linkedlist指针new了一个对象,测试函数中直接把linkedlist赋值为addNewNode返回的指针,原堆对象泄漏。更严重的是如果addNewNode返回的是未通过new分配的野指针,TearDown中对该指针执行delete操作会直接触发段错误。
修正方案:调整测试类初始化逻辑
class LinkedListTest : public ::testing::Test{ public: LinkedList *linkedlist = nullptr; // 初始化为空即可 virtual void SetUp(){} virtual void TearDown(){ delete linkedlist; // 此时delete的是addNewNode返回的合法堆对象 } };
内容的提问来源于stack exchange,提问作者Sachith Muhandiram
相关产品推荐
相关产品推荐

