如何修复C++基于链表实现的栈编译通过但运行无控制台输出的问题?
问题根因分析
- 首次调用
push时直接解引用空指针触发程序崩溃:初始化时top为NULL,你在set_prev(*top)中直接对空指针解引用,程序直接异常终止,自然无任何输出。 - 链表节点使用了栈内存而非堆内存:
push方法中创建的new_node是栈局部对象,函数执行结束后就会被销毁,后续访问该地址属于非法内存访问,会触发未定义行为。 Node类的prev指针未初始化:构造函数仅给data赋值,prev是野指针,任何对它的解引用操作都会触发异常。set_prev、get_prev的接口设计错误:两个方法都直接操作Node对象而非Node*指针,无法正确修改节点前驱的指向,还会产生不必要的对象拷贝。
修正后可运行的完整代码
#include <iostream> using namespace std; class Stack{ class Node{ int data; Node* prev; public: Node(int x) : data(x), prev(nullptr) { // 初始化prev指针 } void set_prev(Node* nd){ // 参数改为指针类型 prev = nd; } Node* get_prev(){ // 返回值改为指针类型 return prev; } int get_data(){ return data; } }; Node* top = nullptr; int count = 0; public: void push(int x){ Node* new_node = new Node(x); // 堆上分配节点内存,生命周期手动控制 new_node->set_prev(top); // 直接传top指针,不解引用 top = new_node; // 修改top指针指向新节点 count++; cout << "Pushing" << endl; } void pop(){ if(!is_empty()){ Node* temp = top; int data = top->get_data(); top = top->get_prev(); delete temp; // 释放弹出的节点内存,避免内存泄漏 count--; cout << "Popping: " << data << endl; }else{ cout << "Stack is empty." << endl; } } int peek(){ return top->get_data(); } int get_count(){ return count; } bool is_empty(){ return count == 0; } // 加析构函数释放所有节点内存,避免泄漏 ~Stack() { while(!is_empty()) { pop(); } } }; int main(){ Stack stk; stk.push(5); stk.push(13); cout << "Top element: " << stk.peek() << endl; stk.pop(); cout << "Top element after pop: " << stk.peek() << endl; return 0; }
核心修改点说明
- 所有节点使用
new在堆上分配内存,保证节点生命周期和栈一致,避免栈内存回收后访问异常 - 修正
Node类构造函数,初始化prev指针为nullptr,避免野指针 - 修改
set_prev和get_prev的参数、返回值为Node*指针类型,直接操作指针地址而非对象拷贝 - 首次
push时不再解引用空的top指针,直接传递指针本身赋值 - 新增析构函数和
pop时的内存释放逻辑,避免内存泄漏
内容的提问来源于stack exchange,提问作者zohani
相关产品推荐
相关产品推荐

