2017-04-22 81 views
0

所以,我很好奇这件事我不明白。如何正确删除std :: stack中的指针?

我创造了一些新的对象,并将它们传递给它们存储在一个std ::栈的功能。

然而,当我要删除他们 - 他们实际上没有被删除,因此,内存使用量将继续攀升“永远”用我的测试循环。

为什么?

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使用是恒定的,但还是 - 我想知道。

干杯!

+0

您有未定义的行为。如果你在一个空的'std :: stack'上调用'states.top()',你会得到未定义的行为。 – Galik

+0

在初始化期间堆栈被填充,所以它永远不会是空的。应该可能提到这一点。 – ludolover

+1

我在本地尝试了一个稍微修改过的版本(以'int *'代替'BaseState *'+检查空栈),在那里我没有泄漏内存(使用地址清理器运行)。 “BaseState”的析构函数可能没有被声明为“虚拟”吗? – Corristo

回答

1

你的代码应该是正确的给你所提到的前提条件,但请注意,您可以分配和回收没有操作系统分配的内存,特别是如果你留在内存分配孔删除对象。因此,请检查内存是否开始增长,然后停止并在内部泄漏内存,如BaseState内部。

如果您在约前提疑问是,在你如果和打印的东西添加一个else子句。我永远不会发生,但如果它发生了,那么调用states.top()可能会有一些问题。