链表实现的C++栈删除top指针是否释放所有节点及智能指针选型问题
问题解答
关于内存泄漏问题
当前你的实现确实存在严重内存泄漏,析构函数仅会释放栈顶节点,其余所有节点对应的堆内存都会残留。
原因是普通裸指针的delete操作仅会释放当前指针指向的内存块,不会自动递归释放其关联的其他堆内存。你当前的栈是链表结构,所有节点通过down指针串联,仅delete栈顶的top指针,只会回收栈顶节点的内存,剩下的节点没有任何指针指向它们,也不会被主动释放。
另外你当前的代码还有一处额外的内存泄漏:类内初始化时你写了node<T> *top = new node<T>;,但构造函数中直接将top赋值为nullptr,你类内初始化new出来的这个节点直接失去了指针引用,直接泄漏,建议直接将类内top的初始化改为node<T> *top = nullptr;即可。
正确的手动管理内存的析构函数写法如下:
~mystack(){ while(top != nullptr){ node<T>* temp = top; top = top->down; delete temp; } std::cout << "DESTRUCTION!" << std::endl; }
关于智能指针的使用建议
实现这类链表/栈结构非常推荐使用智能指针,可以从语法层面避免手动内存管理带来的泄漏、悬空指针、重复释放等问题,大幅降低代码维护成本。
你可以将节点的down指针和栈的top指针都替换为std::unique_ptr,这种情况下你不需要手动编写析构函数,std::unique_ptr在销毁时会自动调用指向对象的析构函数,递归释放整个链表的所有节点,完全不需要手动写循环释放逻辑。
核心改造示例:
#include <memory> #include <iostream> template <class T> struct node{ T data; std::unique_ptr<node<T>> down; }; template <class T> class mystack{ public: std::unique_ptr<node<T>> top = nullptr; mystack(){std::cout << "CONSTRUCTION!" << std::endl;} // 不需要手动写内存释放逻辑,默认生成的析构就能自动释放所有节点 ~mystack(){std::cout << "DESTRUCTION!" << std::endl;} void push(T elem){ auto new_node = std::make_unique<node<T>>(); new_node->data = elem; new_node->down = std::move(top); top = std::move(new_node); } void print_stack(){ node<T> *temp = top.get(); while(temp){ std::cout << temp->data << std::endl; temp = temp->down.get(); } } };
内容的提问来源于stack exchange,提问作者not_here_to_play
相关产品推荐
相关产品推荐

