C++使用stack存储Node指针时仅调用pop出现内存泄漏原因咨询
C++ stack存储原生指针直接pop内存泄漏问题解答
- 内存泄漏和默认构造函数没有任何关联,核心原因是C++标准库stack的pop操作仅会移除容器内存储的元素本身,不会处理原生指针指向的堆内存。你存到栈里的是
Node*类型的指针,它只是一个保存堆内存地址的变量,pop操作只会把这个地址变量从栈里删掉,你之前通过new申请的Node对象本身在堆上,失去指向它的指针后就再也无法被访问和释放,自然产生内存泄漏。 - 不能直接简化为仅调用
pop的写法,要实现自动释放有两种改造方案:- 把栈的声明改为
stack<unique_ptr<Node>>,使用智能指针托管堆内存,此时pop触发unique_ptr析构会自动释放指向的Node对象,不需要手动写delete逻辑,直接调用pop即可。 - 如果必须使用原生指针存储,「先取栈顶指针→
delete释放指向的堆内存→再调用pop移除栈内的指针变量」是该场景下的标准规范写法,不能省略delete步骤。
- 把栈的声明改为
- 额外注意:如果你的
Node类内部的3个同类型指针也是指向堆上申请的节点,需要在Node的析构函数中正确释放这三个指针指向的内存,否则即使释放了当前节点,子节点的内存依然会泄漏。
内容的提问来源于stack exchange,提问作者Nasica
相关产品推荐
相关产品推荐

