• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:デストラクタもしくは、DestroyWindow()で開放とは?)

デストラクタもしくは、DestroyWindow()で開放とは?

このQ&Aのポイント
  • デストラクタもしくは、DestroyWindow()で開放する方法を知りたいです。
  • 開放のコードの書き方や場所が分からないので、教えてください。
  • 開放のコードを書かない場合、どのような不都合が生じるのでしょうか?

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

  • ベストアンサー
noname#30727
noname#30727
回答No.3

>1.どのように対処すれば良いのでしょうか? ちょっと困りました。何を追加したのでしょうか? デストラクタを追加するなら、★印のところって事になると思います。 試してみたましたが、デストラクタが2重に定義されているエラーは出ませんでした。 ---- ColorDialogDlg.h ---- // CColorDialogDlg ダイアログ class CColorDialogDlg : public CDialog { // コンストラクション public: CColorDialogDlg(CWnd* pParent = NULL); // 標準コンストラクタ ★ ~CColorDialogDlg(); [以下省略] ---- ColorDialogDlg.cpp ---- CColorDialogDlg::CColorDialogDlg(CWnd* pParent /*=NULL*/) : CDialog(CColorDialogDlg::IDD, pParent) { } ★CColorDialogDlg::~CColorDialogDlg() ★{ ★}

mk1234
質問者

お礼

inthefloiさん何度もご丁寧な回答有難う御座います。 プロジェクトを一から作り直したところ、エラーが無くなりました。 大変助かりました。貴重な時間を割いていただき有難う御座いました。 <ここからは独り言> たぶん私の操作ミスだと思いますが、よくこのようなことがあるのも事実ですがバグなのでしょうか? (一気に作り上げた場合はエラー無し、同じコードのはずだが思考錯誤した場合はエラーが出る)

その他の回答 (2)

noname#30727
noname#30727
回答No.2

#1 です。 >以下のように追加したところ、エラーが出てしまいました。 ヘッダファイルのほうで宣言してないのではないでしょうか? ~CColorDialogDlg(); >1.デストラクタは自動で書かれる場合があると思いましたが、今回の例題の場合は自分で書く必要があるのでしょうか? MFCは詳しくないですが、VisualStudioがデストラクタが必要だと判断した場合は、自動的に作成されるのかもしれません。 >2.アプリケーションの終了と同時にリソースの開放が行なわれる場合も有ると思いますが、どのような場合に開放されどのような場合に開放されないのでしょうか。 メモリは開放されます。リソースは基本的には開放されませんが、MFCが確保したリソースに関しては、自動的に開放されるはずです。今回の例だと、自分でブラシを追加したのですから、自分で開放することになります。

mk1234
質問者

お礼

回答ありがとうございます。 あわててしまい、エラーメッセージも書かず質問してしまいました。申し訳ありません。 ご指摘のようにヘッダーファイルの記述が抜けていたので追加しましたが、以下のエラーが出ました。 1.どのように対処すれば良いのでしょうか? よろしくおねがいします。 2.また、メモリは開放されるが、リソースは開放されないとはどういう意味でしょうか? メモリは開放されるが、リソースは開放されない???? ColorDialogDlg.obj : error LNK2005: "public: virtual __thiscall CColorDialogDlg::~CColorDialogDlg(void)" (??1CColorDialogDlg@@UAE@XZ) はすでに ColorDialog.obj で定義されています Debug/ColorDialog.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました link.exe の実行エラー

noname#30727
noname#30727
回答No.1

回答1 デストラクタの方がすっきりしてそうですね。 ↓これがデストラクタです。 CColorDialogDlg::~CColorDialogDlg() { } 回答2 ブラシなどのリソースはアプリケーションが終了しても開放されません。このようなリークされたリソースが増えていくと、特にWin95/98/Meなどはリソース不足でウィンドウすら開けなくなり、再起動することになります。

mk1234
質問者

お礼

回答お待ちしてました。有難うございます。感謝です。 1.デストラクタは自動で書かれる場合があると思いましたが、今回の例題の場合は自分で書く必要があるのでしょうか? 2.アプリケーションの終了と同時にリソースの開放が行なわれる場合も有ると思いますが、どのような場合に開放されどのような場合に開放されないのでしょうか。 何度もすみませんが、ご教授ください。

mk1234
質問者

補足

すいません。以下のように追加したところ、エラーが出てしまいました。 初心者で良く分かっていません。 よろしくお願いいたします。 CColorDialogDlg::CColorDialogDlg(CWnd* pParent /*=NULL*/) : CDialog(CColorDialogDlg::IDD, pParent) { ・ ・ ・ } //ここから追加 CColorDialogDlg::~CColorDialogDlg() { if( m_pDlgColor != NULL) { delete m_pDlgColor; } } //ここまで追加