そこで、ここでいくつかのメモリ管理手法を実装しようとしています。私のプログラムでは、stlリストを作成して、クラス「Blast」のオブジェクトとそれぞれのイテレータが含まれるようにしました。
list<Blast> blasts;
list<Blast>::iterator it1;
調べてみると、erase関数を使用すると、クラスのデストラクタが呼び出され、オブジェクトを指すイテレータが削除され、他のポインタ(イテレータ)が返されることがわかりました。ただし、クラスがPODの場合、デストラクタの呼び出しは何も実行しないため、そのオブジェクトに保存されたすべての情報はメモリに保持されます。
これを回避するために、オブジェクトを動的に割り当てて、削除関数を使用してオブジェクトをメモリから消去できるようにしました。
Blast *blast;
blast = new Blast;
しかし、ここで問題が発生しました。オブジェクトをリストにプッシュしようとすると、ポインターをプッシュすることしかできません。
blasts.push_back(*blast);
最初は何も考えていませんでした。だから私は続けた:
if(it2->getX() > 600) {
delete &it2;
it2 = blasts.erase(it2);
}
そのとき、これが行うことは、オブジェクトを指しているポインターを消去し、次にオブジェクトを指しているポインターを指しているポインターを消去することであることに気付きました。
メモリリークがあるかどうかを知る方法がないため、それが実際に正しいかどうかは完全にはわかりません。だから私の質問はこれです:
そのオブジェクトを指しているポインタを削除する前に、メモリからオブジェクトを消去するにはどうすればよいですか?私の実装は正しいですか?オブジェクトをリストにプッシュするだけの場合と同じ結果になりますか?