You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

链表实现的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 22:15:08