存储指针的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
相关产品推荐
相关产品推荐

