プロが教えるわが家の防犯対策術!

MFC MDIプログラミングで、
Genericクラスで点、線、面クラスを作って、
オブジェクトを組み合わせて
3次元図形を作っています。

図形を削除する際、
delete演算子で各オブジェクトの
メモリ解放をプログラムしています。

例)
delete m_pLine;
delete m_pSurface;

しかしながら、これらポインタの中には、
アルゴリズム上、既にdeleteされているものもあるため、
既にdeleteしたオブジェクトを更に
deleteしようとして
実行時エラーを生じてしまいます。

deleteする前に、
当該ポインタが既にdeleteされているかどうか
判定する関数等あれば
if文で回避できると思うのですが、
何か良い方法がありますでしょうか?

よろしくお願いします。

A 回答 (4件)

それは、そもそもアルゴリズム的に間違えているような気がします。


zico さんがソフト開発に関してどの程度のレベルの方かわかりませんが、仮に初心者でしたら、この場合、明らかにプログラムの方針そのものが間違いなので、多重 delete しないような作りに書き直すべきです。
    • good
    • 0
この回答へのお礼

ご連絡が遅くなってすみません。
年末サーバーがダウンしてしまいまして。。。

アドバイスありがとうございました。
おかげさまで、NULL値設定とともにアルゴリズム改良によって
解決することができました。

本年もご指導よろしくお願いします。

お礼日時:2001/01/04 11:30

if (m_pLine != NULL)


{
delete m_pLine;
m_pLine=NULL;
}

とすれば、どうでしょう
    • good
    • 1

簡単な回避方法としては、


delete実行直後に、変数にNULLを代入すれば良いと思います。
例)
if(m_pLine){
delete m_pLine;
m_pLine=NULL;
}
if(m_pSurface){
delete m_pSurface;
m_pSurface=NULL;
}
    • good
    • 0

結構嫌な問題ですね。


生成する前にNULLで初期化しておいて・・・・というのが
定石的な方法でしょうか。
deleteした後もポインタにNULLを入れておく、ということで。
その約束の上でなら、NULLかどうかの判定が出来ます。

それ以外によい方法があるなら・・・私が知りたいです(笑

他にもいくつか方法はありますが、どれもお勧め出来る方法じゃ
ありませんので・・・。
    • good
    • 0
この回答へのお礼

ご連絡が遅くなりましてすみません。

hohihohiさん、MAGIさん、selenityさん、hyde-laさん
昨年は、未熟な自分に
ご指導ありがとうございました。

さて、皆様のご指摘のおかげで、
問題が2つあることがわかり、
無事解決することができました。

1つは、同一ポインタの2重メモリ解放で
ポインタにNULL値を設定することで、
無事解決できました。

もう1つは、
2つ以上のポインタが同一の実体(アドレス)を
参照している場合
(2つの面が同一の辺を共有している場合等)で、

hohihohiさんのご指摘のとおり、
アルゴリズムに問題があり、
1つがdeleteされたら、
共有ポインタ全てにお知らせすることで、
解決することができました。

本当にありがとうございました。
本年もご指導よろしくお願い致します。

ポイントにつきましては、
MAGIさん,selenityさん、hyde-laさんの
3方につきましては、
同様のアドバイスでしたので、
最速のMAGIさんということでご了承願います。
(気持ち的にはみなさんに登録したいのですが。。。)

お礼日時:2001/01/04 11:49

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!