本ページは公開が終了した情報の複製であり、掲載時点での情報です。本ページに記載されている内容について各所に問い合わせることはご遠慮下さい。
サポート技術情報

[VC10] ローカル ヒープが開放されない障害

文書番号: 98867

最終更新日: 2003/08/28


この資料は以下の製品について記述したものです。


この記事は、以前は次の ID で公開されていました: JP98867

概要

この資料は、Microsoft(R) Foundation Class ライブラリ Version 2.0 (以下 MFC 2.0) で作成したプログラムでローカルヒープが消費され開放されない障害について説明したものです。

詳細

MFC 2.0 で作成したプログラムにおいて、ローカル ヒープに作成したテンポラリ オブジェクトを消去しないことがあります。最悪の場合、ローカル ヒープが不足し、プログラムがハングアップします。デバッグ バージョンの MFC では、メモリ リークとして検出されませんが、ヒープ ウォーカで確認することができます。

原因

MFC 2.0 内で、ハンドルは 一時的に使用されるテンポラリ オブジェクトと ハンドルが開放されるまで保持しているパーマネント オブジェクトの 2 つにアタッチされています。
パーマネント オブジェクトからハンドルがデタッチされるとき、テンポラリ オブジェクトからもハンドルはデタッチしています。その結果、テンポラリ オブジェクトが削除できなくなります。

解決方法

以下の手順でハンドル デタッチ時のテンポラリ マップ (m_tempraryMap) からの削除を回避できます。
  1. 以下の行を WINHAND.CPP 158行目から削除またはコメントにしてください。
    (WINHAND.CPP は \MSVC\MFC\SRC に有ります。)
       m_temporaryMap.RemoveKey ((MAPTYPE)h);
    
  2. WINHAND.CPP の145行目と173行目の ASSERT マクロを変更してください。
            変更前
                  ASSERT(ph[0] == h);
            変更後
                  ASSERT(ph[0] == h || ph[0] == NULL);
    
  3. 上記の変更後、MFC2.0 をデバッグ用、リリース用ともに再構築してください。
    \MSVC\MFC\SRC にある MAKEFILE を NMAKE ユーティリティにより実行します。
    詳細は、\MSVC\MFC\SRC にある README.TXT を参照してください。

詳細

Visual C++ 1.51 搭載の MFC 2.5 では、修正済みです。

Keywords: KBBUG kbfix KB98867
Technology: kbAudDeveloper kbMFC kbvc100 kbVC16bitSearch kbVCsearch

inserted by FC2 system