2016-05-20 5 views
3

mylist.erase();を使用してリンクリスト内のノードを削除しようとしています。ですが、ノードはリストに残ります。 delete()を使用しようとしましたが、プログラムがクラッシュしました。何か案が?C++はリンクリスト内のノードを削除できません

list <Person*> :: iterator it; 
it = gamelist.begin(); //gamelist is a <Person*> list. it is an iterator to this list. 
while (it!=gamelist.end()){ 
    if ((*it)->is_dead == true) { 
     delete (*it); //if I comment this line the program does not crash but the "dead" Person still remains in the list. 
     it = gamelist.erase(it); 
    } 
    else ++it; 
} 
+2

こんにちはgamelist.eraseして削除しようとしましたか? –

+0

こんにちは@JuanPablo。はい、私はそれを試しました。同じ問題... –

+2

あなたはあなたが '新しい'メモリを '' 'それは、あなたは確かにそれは解放されていないのですか?あなたは一時的な 'Person *'に '* it'を保存して、その一時的なものを消去して削除することができます。 –

答えて

4

ポインタを削除しても、ポインタがコンテナに残っているかどうかには影響しません。ノードがリストに残っていることを示すプログラムを表示していないので、eraseを呼び出した後にノードが残っていないと仮定します。

ポイントオブジェクトをnewで割り当てた場合は、ある時点でdeleteにする必要があります。ポインタが初期化されていないのいずれか

  • ことを意味し、有効なオブジェクトを指摘したことがないあなたがここにポインタを削除するプログラムがクラッシュし、もし。
  • ポインターは有効ではありましたが、ポインティングされたオブジェクトは既に破棄されており、ポインターはもはや有効ではありません。
  • ポインタは有効ですが、作成されていないオブジェクトを指しています(new)。
  • 尖ったオブジェクトは、デストラクタが依存する有効な状態にありません。 (それは問題ではないので、あなたの場合には、それがnullであるかどうかをチェックしますが、OKであるとクラッシュしないでしょうヌルを削除を除く)

これは、プログラム内の「テスト」ポインタの有効性をすることはできません。あなたはあなたのプログラムを分析し、あなた自身の妥当性を保証しなければなりません。スマートポインタは、ポインタの妥当性についての推論をはるかに容易にします。私はそれらを使用することをお勧めします。

+0

Theoの場合、最終的には、あなたのリストに_insert_要素があるところであなたのコードをチェックし、それらが 'new'で作成されたポインタか' NULL'のいずれかであることを確認する必要があります。 – Sheljohn

+1

@ Sh3ljohnポインタを削除するときにポインタがnullでないことを確認する必要はありません。ポインタは、nullでない場合にのみ有効なオブジェクトを指し示す必要があります。 – user2079303

+0

"すべての場合、ptrがヌルポインタの場合、標準ライブラリの割り当て解除関数は何も行いません。 [[C++ std](http://en.cppreference.com/w/cpp/memory/new/operator_delete)]私はそれを知らなかった、ありがとう。私は以前のコメントを編集しました。 :) – Sheljohn

関連する問題