だから私は理解できないことが不思議だ。std :: 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を代わりに生の作品を使用し、まだ、一定である - 私は知りたいです。
乾杯!
未定義の動作があります。空の 'std :: stack'に対して' states.top() 'を呼び出すと、未定義の動作が発生します。 – Galik
スタックはinit中に読み込まれるため、決して空ではありません。おそらくそれを言及していたはずです。 – ludolover
私は少し修正したバージョン(空のスタックの 'BaseState *' +の代わりに 'int *'を取って)でローカルで試してみましたが、メモリが漏れていません。 'BaseState'のデストラクタが' virtual'宣言されていない可能性はありますか? – Corristo