• ベストアンサー

【VC++6.0(MFC)】MessageBoxを使わず、MessageBoxと同機能を表現するには?

toda hiro(@hiro_knigh)の回答

回答No.8

ちなみに、以前に貴方が以下で質問された件について http://oshiete1.goo.ne.jp/qa5198719.html >>オブジェクトのポインタを保持する変数に上書きでnewしてないか? >すみません、これはどういうことなのでしょうか。 例題は悪いですが、以下のようなソースコードがあったとします。 -------------------------------------- int main() { int *a; int h = 0; printf("start\n"); for (;;) { a = new int[16384]; h = h % 6; if (h == 0){ Sleep(1); } if (h % 2 == 0){ delete[] a; //←hが1,3,5の時に呼ばれないため、メモリリークが発生する。 } h++; } printf("end\n"); } -------------------------------------- この場合、forループの中でnewは毎回呼ばれますが、deleteは2回に1回しか呼ばれません。 それでもaは毎回、新しく確保した領域のアドレスを保持するため2回に1回は確保したアドレスを何処にも保存することなく過ぎて行ってしまいます。 そのため、開放するために必要な情報(アドレス)が何処にも保存されていないためdeleteする事が出来なくなってしまいます。 結果、メモリリークが発生します。 またC++には例外処理があり、一見newした領域が必ずdeleteされるように見れるソースコードでもdeleteを通過せずに抜けてしまう場合があります。(以下ソースコード参照) -------------------------------------- #include<stdio.h> #include<stdlib.h> class CMyReigai{ }; void func_a(); int main() { int *a; try { a = new int[1024]; func_a(); printf("normal end\n"); delete[] a; } catch( CMyReigai ex ){ printf("error end\n"); } getchar(); } void func_a() { CMyReigai b; throw b; } -------------------------------------- デバッグモードで追っていけば分かりますが、func_aをコールした後、deleteが実行されずにcatchに処理が流れます。 上記の原因でメモリリークする場合もあります。。。

関連するQ&A

  • 【VC++6.0(MFC)】警告「LINK : warning LNK4075:」の対処方法を教えてください。

    いつもお世話になっています。 VC++初心者です。 先人が残したVC++6.0のMFCのソースをリビルドすると 以下のような警告がでます。 ***** コードを生成中... リンク中... LINK : warning LNK4075: /EDITANDCONTINUE は /INCREMENTAL:NO の指定によって無視されます ***** リンクがうまくできていないようですが、この対処の仕方を教えていただけませんでしょうか。 よろしくお願いします。

  • 【VC++6.0(MFC)】Access Violationの対応の仕方

    いつも大変お世話になっております。 VC++初心者です。 現在、VC++6.0(MFC)で先人が作成したソースを改良しています。 デバグモードで動かすと、 以下のメッセージが表示されるのですが、 どのように対応すればよいか、教えていただけませんでしょうか。 「例外処理 (初回) は XXXX.exe (NTDLL.DLL) にあります: 0xC0000005: Access Violation」 (※XXXXはプロジェクト名です。) (※デバグモードで動かすと同時に上記エラーが出力されます。) 上記のエラーが出ていても動かせるのですが、 デバグモード時に、メニューの「デバッグ」、「例外処理」で 「 Access Violation」の設定を 「ハンドルされてなければ停止」から「常に停止」に変更すると、 最初の画面も開けずに、混合モード画面の 7C95AB0A inc dword ptr [eax+10h] という箇所で必ず止まって、落ちてしまいます。 ここから、どのように対処すればよいか、ご教授頂きたくお願いします。

  • 【VC++6.0】MFCを利用する参考書を教えてください。

    いつもお世話になっております。 VC++初心者です。 現在、VC++6.0で過去のソースを改良しているのですが、 (個人的な主観ですが)普通のCあまりにコードが 異なりすぎていて、なかなか作業がはかどりません。 (といっても、C言語も熟知は全然していないです。) そこで、以下の内容を満たすような参考書をご存知で あれば教えて頂きたくお願いします。 *************************** ・初心者向け。 ・VC++6.0、MFCの内容。 ・1つの課題があり、それを順次作り込んでいくような内容。 ・オブジェクト指向の説明がある。  (手続き型とオブジェクト指向型プログラミングの   対比があれば嬉しいです。) ・オブジェクト指向でコーディングされている。 ・デバグの仕方、ソースコードの追い方が若干詳しく書かれてる。 *************************** 以上、よろしくお願いします。

  • VC++.NET2003でユーザー関数内でMessageBox::Show()が使えません??

    VC++.NET 2003 のヘルプの、「チュートリアル : 簡単な Windows フォームの作成」に MessageBox::Show()関数を使ってHello,worldを表示させる例が書いていますが、 この関数を、自分で作った関数(フォームのクラスのメンバ関数で、 関数のコードはインライン関数でなく、cppファイル側に書いています)に持っていくと、 error C2653: 'MessageBoxA' : 識別子がクラス名でも名前空間名でもありません。 error C2660: 'System::Windows::Forms::Control::Show' : 関数に 1 個の引数を指定できません。 と、コンパイルエラーが出てしまいます。 MessageBox::Show()を自前の関数で使う方法を、 どなたか教えていただけないでしょうか?

  • VC++の参考書

    VC++(マネージコードではない)の参考書を探しています。 VC++2005かVC++6のどちらかで、MFCを利用するような形で。 1つ1つの機能や命令の説明がされているのではなく、1冊や 各章ごとに1つのアプリケーションを作る、その上で機能や 命令が説明されている、みたいな参考書を探していますが、 今のところ出会えません。 結構VB6だったり.NET系の参考書だとそういうのも多いようですが、 VC++に関しては全然見つかりません。 ご存知の参考書がありましたらご紹介下さい。

  • 【VC++6.0(MFC)】「Out of memory」の対処の仕方を教えてください。

    いつも大変お世話になっております。 VC++初心者です。 現在、VC++6.0(MFC)のソース修正を行っております。 そのソースを長時間実行させると、メッセージボックスで タイトル:ソフト名 メッセージ:Out of memory と出てきて悩んでいます。 (コンパイル、ビルドは成功しています。) (そのソフトを立ち上げなおすと、しばらくの間は正常に動作します。) 大変お手数ですが、 この問題を対処する手順や怪しいと思われる箇所を 経験則でも宜しいので教えて頂けませんでしょうか。

  • 【VC++2005(CLR)】コンソール画面(?)を表示させたい

    いつもお世話になっております。 VC++初心者です。 超超基本的なことなのですが、 Console::WriteLine("aiueo"); と書いた場合、どこに出力されますか? この命令は実行されていると思うのですが、 出力が確認できていないので、困っています。 すみませんが、よろしくお願いします。

  • Session.Countについて(VC2010)

    WEBアプリケーションを作成しております。 VC2005から、VC2010のソースコードアップグレードで、 if(this.Session.Count ==0)の部分でエラーになってしまうのですが、 VC2010では、「this.Session.Count ==0」の部分をどのように変更すればよいのでしょうか? ご存知の方、ご教授願います。

  • 【VC++6.0】ソースコードの文字の大きさを変更させるには?

    いつもお世話になっております。 VC++初心者です。 VC++6.0 enterprise editionを使用していますが、 表示されるソースコードの 文字の大きさを変更できずに困っています。 (VC2005 express editionではできたと思います。) ご存知の方がいらっしゃいましたら、ご教授下さい。

  • イベントハンドラが取得できない VC++ MFC

    おはようございます(><) VC++.NETで開発を行っています。 MFCを使って開発をしています。 CDialogを継承したCmyDialogでOnLButtonDownのイベントがとれません。 OnLButtonDownのイベントを使いたかったのですが 自動でイベントを設定するプロパティのメニュー(雷のマークみたいなもの)にイベントがなかったので 自分でCmyDialog::と書いたらリストの中に OnLButtonDown( UINT nFlags,CPoint point)がでたので 定義に追加、イベントの記述を追加しました。 雷マークで作ったイベントのコードには // TODO : ここにコントロール通知ハンドラ コードを追加します。 と自動で記述され、ブレイクポイントを設定するとそこで止まるのですが 私が記述したLButtonDownのイベントでは実行してもブレイクポイントで止まりません。 他のイベントと比べて違うのは BEGIN_MESSAGE_MAP(CmyDialog, CDialog)の中に ON_NOTIFY(LVN_COLUMNCLICK, IDC_LIST1, OnLvnColumnclickList1) のように イベントハンドラ名、リソース名?、イベント名 と自動で記述があります。 ここを追加すればいいのかなと思いましたが 左クリックに対応するイベントハンドラ名が分かりません。 問題解決に有効な情報をお持ちの方 お力をお貸しください。 よろしくお願いします(><)