現在オフラインです。再接続するためにインターネットの接続を待っています

[VC60] MSVCRT.DLL でページ違反が発生する問題

この記事は、以前は次の ID で公開されていました: JP190536
現象
C ランタイム ライブラリ (以下 CRT) の共有 DLL である MSVCRT.DLL バージョン 6.00.8168.0 または 6.00.8267.0 がインストールされると、それまでは期待通りに動作していたアプリケーションにおいて以下のエラーが発生することがあります。
<アプリケーション名> のページ違反です。モジュール MSVCRT.DLL、アドレス: XXXX:XXXXXXXX
原因
Visual C++ 6.0 で提供される C ランタイム ライブラリ (MSVCRT.DLL) では、小ブロック ヒープ (SBH) 技術の向上のため、これまでヒープの外部に置かれていたヒープ制御構造体を割り当てられたメモリ領域に置くようになりました。結果的に、メモリへの上書きは小ブロック ヒープのポインタ アドレスを変えることになり、これまではメモリを上書きしても動作していたアプリケーションがアクセス違反を引き起こすことがあります。小ブロック ヒープ メモリ管理にかかわるこの問題は、C ランタイム ライブラリ (MSVCRT.DLL) の技術向上のための仕様によるものです。
解決方法
アプリケーション ベンダーは、頒布するアプリケーションが正確に CRT の小ブロック ヒープを使用していることを保証する必要があります。

詳細
小ブロック ヒープは、1 KB 以内の小さなメモリ領域を確保します。Visual C ++ 6.0 では、この技術の向上のため、これまではヒープの外部にあるテーブルに置かれていた制御構造体を、割り当てられたメモリ ヒープに添付するように変更がおこなわれました。この仕様変更のために、古いバージョンの C ランタイム ライブラリ (MSVCRT.DLL) 上では、データを上書きしても問題の発生しないプログラムの潜在的な問題を露見させることがあります。小さなメモリ操作の誤りが、他のメモリ ブロックを破壊し、アプリケーションを異常終了させる原因となります。

この問題は、デバッグ ヒープを使用することで解決することができます。デバッグ ヒープを有効にするには、デバッグ ビルドのアプリケーションでプロセスが初期化されるタイミングで、CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF|_CRTDBG_CHECK_ALWAYS_DF) を呼び出す必要があります。
関連情報

サポート技術情報

文書番号: 197298
タイトル: [VS60] Microsoft Libraries Update について

オンライン ドキュメント

Visual C++ プログラマーズ ガイド :「バッファへの上書きエラーとメモリ リークを解決するには」「_CrtSetDbgFlag」「デバッグ ヒープの使い方」
関連情報
この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID 190536(最終更新日 1999-03-19) をもとに作成したものです。

SP3 crt msvcirt
プロパティ

文書番号:190536 - 最終更新日: 03/31/2004 23:08:00 - リビジョン: 3.0

Microsoft Visual C++ 6.0 Enterprise Edition, Microsoft Visual C++ 6.0 Professional Edition, Microsoft Visual C++, 32-bit Learning Edition 6.0

  • kbfix kbvs600sp2 kbdss kbprb vc50 kbcncl vc60 KB190536
フィードバック