• 締切済み

Access Violationについて

VC++6.0 MFCダイアログベースアプリを作成しているものです。 メインダイアログの他に別ダイアログを追加しようと思い、 新規にクラスを追加し、ダイアログを作成しました。 メインダイアログに終了ボタンがあり、押下することにより、 OnClose()を呼び、アプリを終了させています。 ここで、終了ボタンを押すと、以下のメッセージが表示されます。 ハンドルされていない例外は*****にあります。 0xC0000005: Access Violation 新規追加したクラス宣言部をコメントアウトすると、例外が発生しませんでした。 VC初心者でして、このエラーがメモリー関係では?とは想像がつくのですが、 どのようにアプリに影響しているのかがわかりません。 Access Violationが発生した時の対処法とかクラスを新規追加したことによる、 影響範囲がどの程度あるのか等、ご教授願えませんでしょうか? よろしくお願い致します。

みんなの回答

  • alfeim
  • ベストアンサー率58% (114/195)
回答No.1

VC++のデバッガを使いましょう。 デバッグモードでビルドして、デバッグ-実行 してやればAccess Violationした位置でデバッガがブレークを掛けてくれるはずです。 その後、デバッガのスタックトレースウィンドウから呼び出し元をたどっていき、Access violationの原因となったコードを探しましょう。 #感じ的に初期化/確保されていないポインタ相手にアクセスしたっぽいですが・・・ また、Access Violationなどの場合、スタック破壊が起こっている場合もあります。そういう場合はブレークポイントをいくつか設定して、実行してAccess Violation位置を探しましょう。 >クラスの新規追加による影響 ちゃんと作られたプログラムに変なクラスを突っ込んだ場合は当然影響が出ます。 逆にちゃんと作られたクラスを追加した場合に問題が発生した場合、それまでのプログラムに表面化しなかった問題があった、というだけの事です。作ってる方も人間ですから完全なものは作れないですし・・・(^^; >影響範囲 さまざまかと(^^; C++例外でトラップしてやればAccess Violationもトラップしてやる事は出来ます(参考URLの17章参照)が、通常、起こった時点でアルゴリズム的に問題があると思います。 仕事などでやっている場合は Purify(http://www.sra.co.jp/Rational/purify/purifyNT.html#WhatIsPurify)やBoundsChecker(http://www.numegajapan.com/products/vc.htm)などのプログラムチェッカを導入するのも手ですね。 #蛇足 OnClose()後に例外が発生するという事は終了処理回りに不備があるのでしょう。 確保したメモリを開放していなかったり、逆に既に開放しているメモリをもう一度開放しようとしていたり・・・ ある程度経験を積めば、メモリ周りのトラブルの対処(というよりトラブルを起こさないためのプログラムか)方法も身につくかと。 確かにこの辺のプログラムスタイルについての解説はあまり無いのも確かですが、まったく無いわけでもありません。 ・Effective C++ ・More Effective C++ ・Writing Solidcode ・Code Complete あたりが参考になるかと思います。 また、Access Violation(というよりx86のプロテクトモードの例外機構)については ・はじめて読む486 が参考になるかと思います。

参考URL:
http://www.microsoft.com/japan/developer/library/default.asp?URL=/japan/developer/library/dsmsdn/deep051099.htm

関連するQ&A

  • C言語でのaccess violationについて

    Microsoft Visual C++でプログラムを行っていたのですが、プログラムを実行すると、エラーが発生します。 そこでデバッグを行ったら、 ハンドルされていない例外は”アプリ名.exe”にあります :0xC0000005:Access Violation。 というメッセージが出てきました。 ネットでAccess Violationについて調べたのですが、いまひとつ理解できません。 これはどういうことなのでしょうか?また、解決策をご教授願えないでしょうか? 初心者なので、可能な限り専門用語などを使わない、わかりやすい解説をしていただけると幸いです。お願いします。

  • 【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] という箇所で必ず止まって、落ちてしまいます。 ここから、どのように対処すればよいか、ご教授頂きたくお願いします。

  • 複数のModelessDialogの終了

    メインダイアログと複数のモードレスダイアログがあるアプリがあります。 そのうちの一つのモードレスダイアログに終了ボタンがあり、ボタンが押されるとメインダイアログにSendMessageにて通知して、メインダイアログからモードレスダイアログをDestroyWindowにて終了させ、各モードレスダイアログの変数にNULLをセットするのですが、その後終了ボタン処理に戻ってしまい、Access Violationとなってしまいます。 普通こういう構成のアプリケーションの場合、どういった手段を用いるのが妥当でしょうか。 例えばSendMessageではなくPostMessageを使う等…。 「自分ならこうする」でも結構ですので教えて頂ければと思います。 環境:Windows7+VC9

  • スピンボタンの使い方

    <プログラム環境> Windows XP VC++6.0 MFC AppWizard(exe) ダイアログベース <症状> ダイアログエディタでスピンボタンを配置し、ClassWizardでCSpinButtonCtrl型のメンバ変数を追加しました。 その後コンパイルするとエラー出ないのですが、実行出来ませんでした。 デバッグをすると、「ハンドルされていない例外は、試作.exeに あります:0xC0000005: Access Violation。」 が表示されて、それ以上先には進めません。 メンバ変数を削除すると、症状は無くなります。 <質問> メンバ変数を追加するだけで何故このような症状が出るのでしょうか? スピンボタンでは 初期値40 レンジ:0~80 増加幅:10 減少幅:-10 で設定したいのですが、どのようにしたら良いのでしょか? 宜しければご指摘お願い致します。

  • ボタンが押された時にループから抜けるには

    VC初心者です。 MFCのアプリでダイアログのプロジェクトを作りました。 そこで別のクラスを作成し、無限ループをしているのですが、 ボタンのイベントが発生しません。 どのようにすればボタンのイベントが発生するのでしょうか?

  • LoadLibraryでAccess Violation 発生。

    LoadLibraryでAccess Violation 発生。 開発言語はC++ 開発環境はVisual Studio 6.0 です。 exeファイルを作成し、別のマシンでそのexeファイルを動作させたところアプリが落ちてしまいました。 Dependency Walkerでプロファイルしたところ LoadLibraryで"UNLHA32.DLL"を呼び出した所でAccess Violationのエラーが発生しています。 何か原因に心当たりはありますでしょうか? 現象の詳細は以下の通りです。 (1)同じアプリで動くマシンと動かないマシンがある。 (2)OS依存では無い。(同じOSでも動くマシンと動かないマシンがある) (3)UNLHA32.DLLのバージョンは複数で試しており、またDLLが破損している事も無さそう。 (4)ソースコードを少し変更するとアプリが落ちていたマシンでも正常に動くようになる。 例: ○起動しない ---------------------- // UNLHA32.dllを読んでみる m_hUnlha = LoadLibrary( "UNLHA32.dll" ); ---------------------- ○起動する ---------------------- strcmpi("a", "c"); // UNLHA32.dllを読んでみる m_hUnlha = LoadLibrary( "UNLHA32.dll" ); ---------------------- 例の他にLoadLibraryの後のソースに同じ様な変更を加えても正常に動きました。 具体的な原因や対処法など知恵を貸して頂ければ幸いです。

  • ハンドルされていない例外が発生?

    C++にて作成したアプリを終了すると0xC0000005エラーが発生します。 エラー箇所は AAA *aaa //AAAは外部クラス(グローバル) void BBB{ aaaa = new aaa; aaa->ccc();} void CCC{ aaa->ddd(); delete aaaa; } メイン関数にてBBB→CCCの順で数回読んでいます。 エラーの原因として何が考えられるでしょうか? 開発環境はWindowsXP VC++6.0です。 よろしくお願いします。

  • 別のDLLのダイアログを・・・

    VC++.NETでMFCアプリを開発しています。 コマンド側から、別のDLLのダイアログをCreateし、ShowWindow()したところで例外が発生します。 コマンド側は通常のDLLで作成し、「staticライブラリでMFCを使用する」で使用し、 ダイアログ側は拡張DLLで作成し、「共有DLLでMFCを使用する」で使用しております。 Create()するところで、コマンドのポインタをダイアログに渡すと例外が発生します。 理由がわかりません。教えてくださいm(__)m 説明が足りなければ補足いたします。

  • ハンドルされていない例外は・・・

    ハンドルされていない例外はXXX.exe(YYY.DLL)にあります 0xC0000005:Access Violationというエラーが出ます。 エラーが出ている場所は int nRet = oraDyna.Open(*ZZZ, Sql); です。 ここを通過する時にエラーが発生します。 エラーの原因として何が考えられるでしょうか? 開発環境はWindows2000 VC++6.0です。 よろしくお願いします。

  • ダイアログを終了させてもハンドルが1つ増加したまま。。。

    VC++のMFCを使ってダイアログベースのEXEを造っています。 ハンドルのリークが発生し、困っています。 <動作内容> メインのダイアログで、ボタン押下により別のダイアログを表示します。 DoModal()でモーダルダイアログを作成します。 別のプロセスからブロードキャストされるメッセージを処理したいため、 ボタン押下のルーチンで DoModal() せずに、スレッドを作成し、 そのスレッドで DoModal() を実行しています。 スレッド作成は AfxBeginThread() を使用しています。 <サンプルソース> ●メインダイアログ // ボタン押下のルーチン void CTestModalDlg::OnButton1() { AfxBeginThread( TestDlgThread, (LPVOID)this, THREAD_PRIORITY_NORMAL ); } // スレッド static UINT TestDlgThread(LPVOID pThis) { CTestDlg1 Dlg; Dlg.DoModal(); } ●DoModal() で表示されるダイアログ 何も手を加えてない、デフォルトのまま。 <結果> DoModal() で表示されたダイアログを CDialog::OnCancel() で終了させ、 メインのスレッドが終了しても、ハンドルカウントが1つ増加しています。 Sleep() を入れて値をみてみると、 ・スレッド作成:2増加 ・DoModal() でダイアログ表示:1増加 ・OnCancel() で終了:増減なし ・スレッド終了:2減少 =>結果、1増加となっていました。 以下のパターンでは問題ありませんでした。 ・スレッドを作成+終了(ダイアログ表示しない) ・スレッドを作成せずに、ボタン押下ルーチンから DoModal() でダイアログ表示+終了 ということで、AfxBeginThread()、DoModal() 自体は問題ないのですが、 スレッドを作成して DoModal() するとリークが発生します。 識者の方、原因、対策など、ご教授願います。

専門家に質問してみよう