C++链表头部插入节点异常:输出无限重复相同内容问题
问题根源
你的insertAtHead函数存在致命错误:用局部栈变量创建链表节点。
看这段出错的代码:
Node* CL::insertAtHead(string name) { Node temp; temp.name = name; temp.Next = head; head = &temp; }
Node temp是函数内的局部变量,存储在栈内存中,函数执行完毕后,该变量会被销毁,对应的内存会被系统回收。- 你把链表的
head指向了这个局部变量的地址,导致head变成悬空指针(指向已释放的无效内存)。 - 第二次调用
insertAtHead("a")时,新创建的局部temp大概率会复用之前temp的内存地址。此时temp.Next被设置为之前的head(也就是同一个地址),最终形成自引用循环:当前节点的Next指向自己,所以displayList的循环永远无法终止,无限输出"a"。
修复方案
必须用动态内存分配(new关键字)创建节点,节点会存储在堆内存中,函数结束后不会被销毁:
修改后的insertAtHead函数:
Node* CL::insertAtHead(string name) { Node* temp = new Node; // 动态分配堆内存 temp->name = name; temp->Next = head; head = temp; return temp; // 可选,返回新节点指针 }
额外注意事项
- 链表不再使用时,要遍历释放每个节点的堆内存,避免内存泄漏。可以给
CL类添加析构函数:
~CL() { Node* current = head; while (current != nullptr) { Node* next = current->Next; delete current; current = next; } head = nullptr; }
- C++中建议用
nullptr代替NULL,类型安全性更高。
修复后的完整代码示例
#include <iostream> #include <string> using namespace std; class Node { public: string name; Node* Next; }; class CL { public: Node* head; public: CL(void) { head = nullptr; } // 用nullptr替代NULL Node* insertAtHead(string name); void displayList(void); ~CL(); // 析构函数,负责释放链表内存 }; Node* CL::insertAtHead(string name) { Node* temp = new Node; temp->name = name; temp->Next = head; head = temp; return temp; } void CL::displayList(void){ Node* t = head; while(t != nullptr){ cout << t->name << endl; t = t->Next; } } CL::~CL() { Node* current = head; while (current != nullptr) { Node* next = current->Next; delete current; current = next; } head = nullptr; } int main() { CL poliop; poliop.insertAtHead("am"); poliop.insertAtHead("a"); poliop.displayList(); // 程序结束时析构函数自动调用,释放所有节点内存 }
运行后输出符合预期:
a am
内容的提问来源于stack exchange,提问作者user20336969
相关产品推荐
相关产品推荐

