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

存储指针的std::stack调用delete释放内存的正确操作方式

你写的这段释放逻辑是完全正确的,必须同时执行delete和pop()两个操作,二者作用完全不同,缺一不可:

  • delete m_states.top() 仅负责释放栈顶指针指向的堆内存,也就是你通过new创建的GameState/MenuState实例的存储空间。这个操作不会修改std::stack本身的存储内容,执行完delete之后,栈里仍然存着刚才那个指针,只是这个指针已经变成野指针了。
  • m_states.pop() 负责把已经完成内存释放的野指针从栈容器中移除,让栈的元素个数减1。

如果你删掉pop()调用,m_states.empty()的判断永远不会成立,循环会一直执行,反复delete同一个野指针,属于标准的未定义行为,几乎必然导致程序崩溃。

额外补充一个注意点:因为你是通过父类State的指针释放子类实例,用到了多态特性,必须保证State类定义了虚析构函数,否则子类的专属资源会无法正确释放,也会触发未定义行为。

内容的提问来源于stack exchange,提问作者JoseC1098

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 21:54:07