【问题标题】:Calling delete on std::stack of pointers在 std::stack 指针上调用 delete
【发布时间】:2021-12-31 03:10:24
【问题描述】:

我有一个std::stack,里面有一些指针:

std::stack<State*> m_states;

当我初始化我的程序时,我调用new 将一个项目压入堆栈(它必须是一个指针,因为我将使用多态类型)。

这是删除所有东西的正确方法吗?

这里是我调用 new 的地方(GameState 和 MenuStatesare classes inherited fromState`):

m_states.push(new GameState());
m_states.push(new MenuState());

这就是我在整个 App 类的析构函数中所拥有的:

while (!m_states.empty())
{
    delete m_states.top(); // (*)
    m_states.pop();
}

我应该只拨打 (*),还是也需要拨打 pop()

【问题讨论】:

  • 最好使用unique_ptr 并且根本不需要处理清理工作。

标签: c++ pointers heap-memory stack-memory


【解决方案1】:

我应该只调用 (*) 还是我也需要弹出?

好吧,如果您while 循环中调用pop(),那么该循环将如何结束?换句话说,条件!m_states.empty() 将如何变成false

还有其他容器类型(如std::vector),您可以只遍历每个成员,删除指向的对象,然后清除容器,但您不能这样做使用std::stack 容器。也就是说,堆栈没有[] 运算符——您只能访问顶部元素。

【讨论】:

    猜你喜欢
    • 2018-10-21
    • 2011-04-18
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 2017-09-19
    • 1970-01-01
    • 1970-01-01
    • 2020-07-07
    相关资源
    最近更新 更多