双向链表pop_back函数空指针错误排查求助
问题分析与修复方案
让我来帮你排查下双向链表pop_back函数出现空指针错误的问题:
1. 核心问题:未处理边界情况引发的空指针与野指针
你的pop_back函数开头直接访问tail->value,但如果链表是空的(比如还没调用过push_back,或者已经把所有元素都弹出了),tail会是nullptr,这时候直接访问它的成员必然触发空指针异常。
另外,当链表只剩最后一个元素时,你只重置了tail为NULL,但head仍然指向已经被删除的节点,变成了野指针,后续操作会引发未定义行为。
2. 修复后的pop_back函数
double linked_list::pop_back() { // 先判断链表是否为空,避免空指针访问 if (tail == nullptr) { // 这里可以根据业务需求选择处理方式,比如抛出异常或返回特殊值 throw std::out_of_range("Cannot pop from an empty linked list"); } double value = tail->value; if (size() == 1) { delete tail; tail = nullptr; head = nullptr; // 同时重置head,避免野指针 } else { node_t* temp = tail->prev; temp->next = nullptr; delete tail; tail = temp; } // 别忘了同步更新size计数(如果你的size()是维护的成员变量而非实时计算) // size--; return value; }
3. push_back函数的小优化
你的push_back里有一行多余的赋值:n->value = value;,因为你已经通过node_t *n = new node_t(value);初始化了节点的value,这行可以删掉,优化后的代码:
void linked_list::push_back(double value) { node_t* n = new node_t(value); // 构造时已初始化value n->next = nullptr; n->prev = tail; if (head == nullptr) { head = n; } else { tail->next = n; } tail = n; // 同步更新size计数 // size++; }
额外提醒
请确保你的size()函数是正确维护的:每次push_back要递增size,pop_back要递减size。如果size()是通过遍历链表计算的,那效率会很低,建议用一个成员变量来维护当前链表的元素数量。
内容的提问来源于stack exchange,提问作者Allamo Olsson
相关产品推荐
相关产品推荐

