MFC MDIプログラミングで、
Genericクラスで点、線、面クラスを作って、
オブジェクトを組み合わせて
3次元図形を作っています。
図形を削除する際、
delete演算子で各オブジェクトの
メモリ解放をプログラムしています。
例)
delete m_pLine;
delete m_pSurface;
しかしながら、これらポインタの中には、
アルゴリズム上、既にdeleteされているものもあるため、
既にdeleteしたオブジェクトを更に
deleteしようとして
実行時エラーを生じてしまいます。
deleteする前に、
当該ポインタが既にdeleteされているかどうか
判定する関数等あれば
if文で回避できると思うのですが、
何か良い方法がありますでしょうか?
よろしくお願いします。
No.1
- 回答日時:
それは、そもそもアルゴリズム的に間違えているような気がします。
zico さんがソフト開発に関してどの程度のレベルの方かわかりませんが、仮に初心者でしたら、この場合、明らかにプログラムの方針そのものが間違いなので、多重 delete しないような作りに書き直すべきです。
ご連絡が遅くなってすみません。
年末サーバーがダウンしてしまいまして。。。
アドバイスありがとうございました。
おかげさまで、NULL値設定とともにアルゴリズム改良によって
解決することができました。
本年もご指導よろしくお願いします。
No.3
- 回答日時:
簡単な回避方法としては、
delete実行直後に、変数にNULLを代入すれば良いと思います。
例)
if(m_pLine){
delete m_pLine;
m_pLine=NULL;
}
if(m_pSurface){
delete m_pSurface;
m_pSurface=NULL;
}
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さんということでご了承願います。
(気持ち的にはみなさんに登録したいのですが。。。)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) アクセス 削除するレコードを含んだテーブルを指定してくださいのエラー対処方法 1 2022/11/24 15:01
- マウス・キーボード Deleteキーを同時押しで入力できるようにするソフト 2 2023/08/10 21:55
- 英語 Osteogenesis in group B and C were significantly l 2 2022/03/24 05:27
- MySQL 下の画像はSQLの4大命令の性質をまとめたものであるらしいです UPDATE INSERT DELE 1 2023/06/07 15:36
- Visual Basic(VBA) VBA 行削除した連番 4 2023/06/27 16:00
- Visual Basic(VBA) Excelマクロでセルに値が入力されたら実行する 5 2023/08/06 11:03
- フリーソフト USB内のフィアルの復活ソフトは? 4 2023/03/25 08:54
- Visual Basic(VBA) 数字が「0」の列を削除するため、下記のコードを実行しましたが、コンパイルエラーSubまたはFunct 3 2022/12/04 00:00
- Visual Basic(VBA) シート削除のマクロで「deleteメソッドは失敗しました」となります。助けてください! Sub 不要 6 2022/09/08 16:41
- Visual Basic(VBA) Excelにて、シート1の行を削除するとシート2のシート1と同じ番号の行も削除したい 3 2022/05/08 04:24
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CreateObjectとはどういう意味...
-
コンストラクタ内でのthisポインタ
-
クラスの設定について
-
デザイナ時のエラー「オブジェ...
-
イベントにAddHandlerされてい...
-
ユーザーフォームのVBAエラー
-
FriendとPublicの違い。。。
-
C#のクラス設計について教えて...
-
MFCのドラッグ&ドロップについて
-
クラスのアドレスを引数として...
-
オーバーライド関数の呼び出し...
-
既定のコンストラクタがない?
-
MRUの一時回避 VC++2008 MFC
-
MFCアプリのコマンドラインでパ...
-
C++ protectedにアクセス不可
-
vba sendKeysを送る相手のソフ...
-
MFC CSplitter内にコントロール...
-
ダイアログ表示時にチェックボ...
-
VC++ MFC CFrameWndって・・・
-
このコンパイルエラーの意味に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CreateObjectとはどういう意味...
-
オブジェクト型の変数が定義さ...
-
メモリリークが発生するのはど...
-
コンストラクタ内でのthisポインタ
-
クラス内にWin32APIのコールバ...
-
C#でのUNZIP32.DLLの利用方法が...
-
C# panel内のコントロールの使...
-
関数で値渡しと参照渡しではど...
-
VB6では、Applicationは未定義...
-
ボタンを押すとラベルの文字を...
-
イベントドリブンとオブジェク...
-
【VC++6.0(MFC)】「Out of memo...
-
メモリ解放について、ご教授く...
-
デザイナ時のエラー「オブジェ...
-
オブジェクトをどこでdisposeす...
-
Visual studio c# android オブ...
-
UMLでの「オブジェクト」と「イ...
-
SetとNothingの存在意味?
-
C#でのコンパイル時のエラー
-
オブジェクトの廃棄
おすすめ情報