2017-04-22 3 views
0

だから私は理解できないことが不思議だ。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を代わりに生の作品を使用し、まだ、一定である - 私は知りたいです。

乾杯!

+0

未定義の動作があります。空の 'std :: stack'に対して' states.top() 'を呼び出すと、未定義の動作が発生します。 – Galik

+0

スタックはinit中に読み込まれるため、決して空ではありません。おそらくそれを言及していたはずです。 – ludolover

+1

私は少し修正したバージョン(空のスタックの 'BaseState *' +の代わりに 'int *'を取って)でローカルで試してみましたが、メモリが漏れていません。 'BaseState'のデストラクタが' virtual'宣言されていない可能性はありますか? – Corristo

答えて

1

あなたが言及した前提条件を満たせばコードは正しいはずですが、特にメモリに割り当て穴を残しておけば、オペレーティングシステムに割り当てられたメモリを再利用せずにオブジェクトを割り当てたり削除することができます。だから、メモリが成長を開始し、停止し、メモリリークが発生した場合は、BaseStateの内部のように、両方をチェックしてください。

前提条件が疑わしい場合は、ifにelse節を追加して何かを印刷してください。私は決して起こるべきではありませんが、もしそうなら、states.top()を呼び出す際に問題があるかもしれません。

関連する問題