MFC MDIプログラミングで、
Genericクラスで点、線、面クラスを作って、
オブジェクトを組み合わせて
3次元図形を作っています。
図形を削除する際、
delete演算子で各オブジェクトの
メモリ解放をプログラムしています。
例)
delete m_pLine;
delete m_pSurface;
しかしながら、これらポインタの中には、
アルゴリズム上、既にdeleteされているものもあるため、
既にdeleteしたオブジェクトを更に
deleteしようとして
実行時エラーを生じてしまいます。
deleteする前に、
当該ポインタが既にdeleteされているかどうか
判定する関数等あれば
if文で回避できると思うのですが、
何か良い方法がありますでしょうか?
よろしくお願いします。
No.4
- 回答日時:
結構嫌な問題ですね。
生成する前にNULLで初期化しておいて・・・・というのが
定石的な方法でしょうか。
deleteした後もポインタにNULLを入れておく、ということで。
その約束の上でなら、NULLかどうかの判定が出来ます。
それ以外によい方法があるなら・・・私が知りたいです(笑
他にもいくつか方法はありますが、どれもお勧め出来る方法じゃ
ありませんので・・・。
ご連絡が遅くなりましてすみません。
hohihohiさん、MAGIさん、selenityさん、hyde-laさん
昨年は、未熟な自分に
ご指導ありがとうございました。
さて、皆様のご指摘のおかげで、
問題が2つあることがわかり、
無事解決することができました。
1つは、同一ポインタの2重メモリ解放で
ポインタにNULL値を設定することで、
無事解決できました。
もう1つは、
2つ以上のポインタが同一の実体(アドレス)を
参照している場合
(2つの面が同一の辺を共有している場合等)で、
hohihohiさんのご指摘のとおり、
アルゴリズムに問題があり、
1つがdeleteされたら、
共有ポインタ全てにお知らせすることで、
解決することができました。
本当にありがとうございました。
本年もご指導よろしくお願い致します。
ポイントにつきましては、
MAGIさん,selenityさん、hyde-laさんの
3方につきましては、
同様のアドバイスでしたので、
最速のMAGIさんということでご了承願います。
(気持ち的にはみなさんに登録したいのですが。。。)
No.3
- 回答日時:
簡単な回避方法としては、
delete実行直後に、変数にNULLを代入すれば良いと思います。
例)
if(m_pLine){
delete m_pLine;
m_pLine=NULL;
}
if(m_pSurface){
delete m_pSurface;
m_pSurface=NULL;
}
No.1
- 回答日時:
それは、そもそもアルゴリズム的に間違えているような気がします。
zico さんがソフト開発に関してどの程度のレベルの方かわかりませんが、仮に初心者でしたら、この場合、明らかにプログラムの方針そのものが間違いなので、多重 delete しないような作りに書き直すべきです。
ご連絡が遅くなってすみません。
年末サーバーがダウンしてしまいまして。。。
アドバイスありがとうございました。
おかげさまで、NULL値設定とともにアルゴリズム改良によって
解決することができました。
本年もご指導よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語について。
-
3×3のラテン方陣をつくるプログ...
-
VisualStudio2022でC言語プログ...
-
2つほどお聞きしたいことがあり...
-
UART通信の取説で,left floati...
-
10進数からN進数に変換するプロ...
-
gccを行ってもexeファイルが生...
-
MACで動く実行ファイルをWindow...
-
ストリームについて。
-
Cのコンパイルでコメントアウト...
-
Windows Formアプリからコンソ...
-
パソコン
-
今ってプログラミング言語は何...
-
どうして+3
-
プログラミング言語についてc++...
-
次の記述について
-
C#でTreeViewのCheckBoxのサイ...
-
逆コンパイルと逆アセンブルの...
-
プログラムの実行時に'<'でリダ...
-
私は
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
オブジェクト型の変数が定義さ...
-
関数で値渡しと参照渡しではど...
-
CreateObjectとはどういう意味...
-
C# panel内のコントロールの使...
-
メモリリークが発生するのはど...
-
デザイナ時のエラー「オブジェ...
-
SetとNothingの存在意味?
-
コンストラクタ内でのthisポインタ
-
イベントドリブンとオブジェク...
-
クラス内にWin32APIのコールバ...
-
UMLでの「オブジェクト」と「イ...
-
Objective-c 画像処理
-
【VC++6.0(MFC)】「Out of memo...
-
ボタンを押すとラベルの文字を...
-
VB6では、Applicationは未定義...
-
プログラミング
-
ゆかりネットで東北ずん子exを...
-
最小化したフォームを元に戻す
-
VisualC#でデザイナでくっつけ...
-
オブジェクトをどこでdisposeす...
おすすめ情報