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使用是恒定的,但还是 - 我想知道。
干杯!
您有未定义的行为。如果你在一个空的'std :: stack'上调用'states.top()',你会得到未定义的行为。 – Galik
在初始化期间堆栈被填充,所以它永远不会是空的。应该可能提到这一点。 – ludolover
我在本地尝试了一个稍微修改过的版本(以'int *'代替'BaseState *'+检查空栈),在那里我没有泄漏内存(使用地址清理器运行)。 “BaseState”的析构函数可能没有被声明为“虚拟”吗? – Corristo