-PR-
解決済み

delete演算子によるメモリ解放について

  • すぐに回答を!
  • 質問No.22616
  • 閲覧数751
  • ありがとう数5
  • 気になる数0
  • 回答数4
  • コメント数0

お礼率 60% (48/80)

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

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

例)
delete m_pLine;
delete m_pSurface;

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

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

よろしくお願いします。
通報する
  • 回答数4
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.2
レベル7

ベストアンサー率 45% (5/11)

if (m_pLine != NULL)
{
delete m_pLine;
m_pLine=NULL;
}

とすれば、どうでしょう
関連するQ&A
-PR-
-PR-

その他の回答 (全3件)

  • 回答No.1
レベル9

ベストアンサー率 34% (23/66)

それは、そもそもアルゴリズム的に間違えているような気がします。 zico さんがソフト開発に関してどの程度のレベルの方かわかりませんが、仮に初心者でしたら、この場合、明らかにプログラムの方針そのものが間違いなので、多重 delete しないような作りに書き直すべきです。 ...続きを読む
それは、そもそもアルゴリズム的に間違えているような気がします。
zico さんがソフト開発に関してどの程度のレベルの方かわかりませんが、仮に初心者でしたら、この場合、明らかにプログラムの方針そのものが間違いなので、多重 delete しないような作りに書き直すべきです。
お礼コメント
zico

お礼率 60% (48/80)

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

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

本年もご指導よろしくお願いします。
投稿日時 - 2001-01-04 11:30:48


  • 回答No.3
レベル12

ベストアンサー率 41% (324/772)

簡単な回避方法としては、 delete実行直後に、変数にNULLを代入すれば良いと思います。 例) if(m_pLine){ delete m_pLine; m_pLine=NULL; } if(m_pSurface){ delete m_pSurface; m_pSurface=NULL; }
簡単な回避方法としては、
delete実行直後に、変数にNULLを代入すれば良いと思います。
例)
if(m_pLine){
delete m_pLine;
m_pLine=NULL;
}
if(m_pSurface){
delete m_pSurface;
m_pSurface=NULL;
}
  • 回答No.4
レベル10

ベストアンサー率 28% (42/146)

結構嫌な問題ですね。 生成する前にNULLで初期化しておいて・・・・というのが 定石的な方法でしょうか。 deleteした後もポインタにNULLを入れておく、ということで。 その約束の上でなら、NULLかどうかの判定が出来ます。 それ以外によい方法があるなら・・・私が知りたいです(笑 他にもいくつか方法はありますが、どれもお勧め出来る方法じゃ ありませんので・・・。 ...続きを読む
結構嫌な問題ですね。
生成する前にNULLで初期化しておいて・・・・というのが
定石的な方法でしょうか。
deleteした後もポインタにNULLを入れておく、ということで。
その約束の上でなら、NULLかどうかの判定が出来ます。

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

他にもいくつか方法はありますが、どれもお勧め出来る方法じゃ
ありませんので・・・。
お礼コメント
zico

お礼率 60% (48/80)

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

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:07
このQ&Aのテーマ
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


新大学生・新社会人のパソコンの悩みを解決!

いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ