如何正确删除std :: stack中的指针?

时间:2017-04-22 00:32:21

标签: c++ pointers memory-management stack

所以,我很好奇这件事,我无法弄明白。

我创建了一些新对象并将它们传递给一个将它们存储在std :: stack中的函数。

然而,当我想要删除它们时 - 它们实际上并没有被删除,因此,内存使用将继续攀升"永远"我的测试循环。

为什么?

bool StateMachine::changeState(BaseState *state) {
    if (state == nullptr) {
        delete states.top();
        states.pop();
        if (states.size() == 0) {
            return false;
        }
    } else if (state != states.top()) {
        states.push(state);
    }
    return true;
}

测试循环:

while (true) {
    machine.changeState(new MenuState);
    machine.changeState(nullptr);
}

使用std :: unique_ptr代替原始作品,现在ram的使用是不变的,但仍然 - 我想知道。

干杯!

1 个答案:

答案 0 :(得分:1)

根据您提到的前提条件,您的代码应该是正确的,但请注意您可以在不回收操作系统分配的内存的情况下分配和删除对象,尤其是在内存中留下分配漏洞时。因此,检查内存是否开始增长然后停止以及其他地方的内存泄漏,例如在BaseState内部。

如果您对前置条件有疑问,请在if中添加else子句并打印一些内容。我永远不会发生,但如果确实如此,那么调用states.top()可能会有一些问题。