- ベストアンサー
delete演算子によるメモリ解放について
MFC MDIプログラミングで、 Genericクラスで点、線、面クラスを作って、 オブジェクトを組み合わせて 3次元図形を作っています。 図形を削除する際、 delete演算子で各オブジェクトの メモリ解放をプログラムしています。 例) delete m_pLine; delete m_pSurface; しかしながら、これらポインタの中には、 アルゴリズム上、既にdeleteされているものもあるため、 既にdeleteしたオブジェクトを更に deleteしようとして 実行時エラーを生じてしまいます。 deleteする前に、 当該ポインタが既にdeleteされているかどうか 判定する関数等あれば if文で回避できると思うのですが、 何か良い方法がありますでしょうか? よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
if (m_pLine != NULL) { delete m_pLine; m_pLine=NULL; } とすれば、どうでしょう
その他の回答 (3)
- hyde-la
- ベストアンサー率28% (42/146)
結構嫌な問題ですね。 生成する前にNULLで初期化しておいて・・・・というのが 定石的な方法でしょうか。 deleteした後もポインタにNULLを入れておく、ということで。 その約束の上でなら、NULLかどうかの判定が出来ます。 それ以外によい方法があるなら・・・私が知りたいです(笑 他にもいくつか方法はありますが、どれもお勧め出来る方法じゃ ありませんので・・・。
- selenity
- ベストアンサー率41% (324/772)
簡単な回避方法としては、 delete実行直後に、変数にNULLを代入すれば良いと思います。 例) if(m_pLine){ delete m_pLine; m_pLine=NULL; } if(m_pSurface){ delete m_pSurface; m_pSurface=NULL; }
- hohihohi
- ベストアンサー率34% (23/66)
それは、そもそもアルゴリズム的に間違えているような気がします。 zico さんがソフト開発に関してどの程度のレベルの方かわかりませんが、仮に初心者でしたら、この場合、明らかにプログラムの方針そのものが間違いなので、多重 delete しないような作りに書き直すべきです。
お礼
ご連絡が遅くなってすみません。 年末サーバーがダウンしてしまいまして。。。 アドバイスありがとうございました。 おかげさまで、NULL値設定とともにアルゴリズム改良によって 解決することができました。 本年もご指導よろしくお願いします。
お礼
ご連絡が遅くなりましてすみません。 hohihohiさん、MAGIさん、selenityさん、hyde-laさん 昨年は、未熟な自分に ご指導ありがとうございました。 さて、皆様のご指摘のおかげで、 問題が2つあることがわかり、 無事解決することができました。 1つは、同一ポインタの2重メモリ解放で ポインタにNULL値を設定することで、 無事解決できました。 もう1つは、 2つ以上のポインタが同一の実体(アドレス)を 参照している場合 (2つの面が同一の辺を共有している場合等)で、 hohihohiさんのご指摘のとおり、 アルゴリズムに問題があり、 1つがdeleteされたら、 共有ポインタ全てにお知らせすることで、 解決することができました。 本当にありがとうございました。 本年もご指導よろしくお願い致します。 ポイントにつきましては、 MAGIさん,selenityさん、hyde-laさんの 3方につきましては、 同様のアドバイスでしたので、 最速のMAGIさんということでご了承願います。 (気持ち的にはみなさんに登録したいのですが。。。)