-PR-
解決済み

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

  • すぐに回答を!
  • 質問No.5370913
  • 閲覧数676
  • ありがとう数1
  • 気になる数0
  • 回答数9
  • コメント数0

お礼率 42% (104/244)

いつも大変お世話になっております。
VC++初心者です。

現在、先人のつくったソースを見直しています。
ある条件になるとエラーを知らせるMessageBoxを出力するのですが、
デバグモードでMessageBoxが使われれている全ての箇所に
ブレイクポイントをおいても、それらのブレイクポイントに引っかかって
くれません。

そうなると、MessageBox以外の命令でMessageBoxと同様のことを
しているコードがあると思っているのですが、そういう機能の命令
はどのようなものがあるのでしょうか。

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

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

  • 回答No.9

まず何度かエラーメッセージが表示されているみたいなので、再現性があると思うのですが、再現手順は確立されているんでしょうか?
確立されているのなら、デバッグしながらその手順を行いプログラムを1行ずつ実行させれば良いと思うのですが。
確立されていないなら、確立する努力をするのが一番の近道だと思います。(コードの量と再現率によりますが)
それでも無理なら動的解析ツールを使った方が良いかも知れません。

以下はつぶやき。
MFCを使っているなら、メモリーリークはそれ程気にしなくても良いかも。MFC自体がリークしてるので。。。
それから動的なメモリ確保のメリットってどれくらいあるのでしょうか。。。
組込みの開発をしていて、ファイルの書き込み回数の制限があった時に圧縮をするときには圧縮後のサイズが事前に分からないので動的にメモリを確保しましたが、それ以外で動的にメモリを確保するメリットがあまり思い浮かびません。
PCアプリなら単純にファイルに書き込めば良いですし。。。
遠い記憶ですが、データサイズが事前に予測できないデータをファイルに書き込んでも、書き込んだデータは実はメモリ上に保持されていてファイルストリームを使って引き回しても処理速度が落ちなかった経験がありました。。。
お礼コメント
yuki7091

お礼率 42% (104/244)

皆様、ご回答ありがとうございました。
(すみません、しばらく放置しておりました。)

まだ解決していませんが、勝手ながら
本件は一度締め切らせていただきます。

ご協力ありがとうございました。
投稿日時 - 2010-03-24 23:13:01

その他の回答 (全8件)

  • 回答No.7
レベル10

ベストアンサー率 39% (59/151)

お疲れ様です。

メモリリークだと思い、興味があって調べてみましたが結果はまだ出ていません。

メモリリークの原因としてはnewより、newで確保した領域がなんらかの原因でdeleteされていない方が多いと思います。

そこで、googleで「メモリリーク mfc」で検索してみました。


そうすると「DEBUG_NEW」に行き着きました。

「DEBUG_NEW」を定義すればメモリリークの検出手助けになると記載されているようですが、イマイチ使用方法が不明です。
そして、デバッグ版でコンパイルされた時のみしかつかえないようです。

あとは、malloc,free,new,deleteをラップして調べてみるしかないと思ったのですが、イマイチよいソースコードが記述出来ていません。

方法としては以下を考えています。
(1)newやmallocで確保した場合、確保したアドレスとソースコードのファイル名・ラインを保存
 (ファイル等で保存[アドレスはvoidにキャストして保存])
(2)deleteやfreeで開放したアドレスをキーに、(1)の対応した領域を削除

メモリリークが発生した時にファイルの中をのぞいて、同じ位置で確保し開放されていないエリアがたくさんあれば、その確保した処理に対する開放処理が無いか、何らかの原因で呼ばれなくなっているかだと思います。

興味があるのでもう少し調査や検討をしてみます。
もし、ご自身で分かられた場合は申し訳ありませんが方法を教えて頂けると幸いです。

メモリリークは10年ほど前にPL/Mでプログラムを組んでいた頃に経験はしましたが、デバッグは経験者にまかせてしまったので解決方法はイマイチ覚えていません。


  • 回答No.8
レベル10

ベストアンサー率 39% (59/151)

ちなみに、以前に貴方が以下で質問された件について
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に処理が流れます。

上記の原因でメモリリークする場合もあります。。。
  • 回答No.1
レベル14

ベストアンサー率 42% (926/2160)

DoModal( )でモーダルダイアログが表示できます。
補足コメント
yuki7091

お礼率 42% (104/244)

ご回答、ありがとうございます。

使用しているすべてのDoModal( )にブレイクポイントを
設定しても、引っかかりませんでした。
投稿日時 - 2009-10-16 09:36:07
  • 回答No.2
レベル13

ベストアンサー率 19% (332/1696)

MessageBoxに表示されているメッセージを検索してみたら?
案外MFCとかが出しているMessageBoxとかもあるから、闇雲にブレークポイントを張るのは得策じゃないと思う。
補足コメント
yuki7091

お礼率 42% (104/244)

ご回答、ありがとうございます。

MessageBoxに表示されているメッセージを検索しても
引っかからないのです。

>案外MFCとかが出しているMessageBoxとかもあるから、
これはどういうことなのでしょうか?
投稿日時 - 2009-10-16 12:07:07
  • 回答No.3
レベル12

ベストアンサー率 32% (260/806)

>ある条件になるとエラーを知らせるMessageBoxを出力するのですが、
そもそも、その「表示内容」はプログラム中で設定されている内容が表示されていますか?
No.2氏が書かれている通り、MFCやOSが出しているものではないですか?

まず、ダイアログに表示されているメッセージ内容を教えてください。
補足コメント
yuki7091

お礼率 42% (104/244)

ご回答、ありがとうございます。

本件は、以前も相談させていただきましたが、解決できなかったので、
再度質問させて頂いております。

>そもそも、その「表示内容」はプログラム中で設定されている内容が表示されていますか?
そのMessageBoxに書かれている内容は、プログラム中には発見できませんでした。

>No.2氏が書かれている通り、MFCやOSが出しているものではないですか?
そうなのかも知れませんが、誰がどこで出しているか検討がついていないのが現状です。

>まず、ダイアログに表示されているメッセージ内容を教えてください。
そのダイアログに表示された内容は、
タイトル     :XXXX(プロジェクト名です。(拡張子はついておりません。))
メッセージ内容:Out of memory
です。
投稿日時 - 2009-10-16 12:43:13
  • 回答No.4
レベル14

ベストアンサー率 42% (926/2160)

例えばRuntime errorとか
  • 回答No.5
レベル12

ベストアンサー率 32% (260/806)

No.3です
>>まず、ダイアログに表示されているメッセージ内容を教えてください。
>そのダイアログに表示された内容は、
>タイトル     :XXXX(プロジェクト名です。(拡張子はついておりません。))
>メッセージ内容:Out of memory
典型的なメモリ管理(製造)ミスのメッセージですね。
ここでいう「メモリ」とはPCの「(OSが認識している)物理的な」メモリではなく、プログラムとして誤ったメモリ操作をしていることを意味しています。

>>No.2氏が書かれている通り、MFCやOSが出しているものではないですか?
>そうなのかも知れませんが、誰がどこで出しているか検討がついていないのが現状です。
やることはたった一つです。「原因の絞り込み」これだけです。
・実際にどのようにアプリを操作したら発生するのか
・アプリ発生時に動作している処理の特定
これを大きなところから、しだいに狭い領域に絞り込んでいきます。

プログラムは、そのプログラムだけで動作が簡潔しているのではなく、APIの呼び出し先はDLLとして別ファイル(プログラム)として存在します。
そういった箇所の問題であれば、いくら「ダイアログが出るから」と自分のソースの表示箇所だけを追いかけても永久にたどり着くことはできません。
  • 回答No.6
レベル13

ベストアンサー率 60% (434/720)

 こんばんは。

 newの内部で「CMemoryExceptionクラス」が発生しているのではないでしょうか。
 http://msdn.microsoft.com/ja-jp/library/bc8b34bc(VS.80).aspx

 newを使用している箇所を以下の様にすれば特定し易くなると思います。

try
{
???* p = new ???(...);
}
catch(CMemoryException* e)
{
::MessageBox(NULL, NULL, NULL, IDOK);//●ココにポイントを張る
}
このQ&Aで解決しましたか?
関連するQ&A
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

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

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

特集


開業・独立という夢を持つ人へ向けた情報満載!

ピックアップ

-PR-
ページ先頭へ