文書番号: 98867
最終更新日: 2003/08/28
この資料は以下の製品について記述したものです。
- The Microsoft Foundation Classes (MFC) を以下の環境でお使いの場合
- Microsoft Visual C++ for Windows, 16-bit edition 1.0
この記事は、以前は次の ID で公開されていました: JP98867
概要
この資料は、Microsoft(R) Foundation Class ライブラリ Version 2.0 (以下 MFC 2.0) で作成したプログラムでローカルヒープが消費され開放されない障害について説明したものです。
詳細
MFC 2.0 で作成したプログラムにおいて、ローカル ヒープに作成したテンポラリ オブジェクトを消去しないことがあります。最悪の場合、ローカル ヒープが不足し、プログラムがハングアップします。デバッグ バージョンの MFC では、メモリ リークとして検出されませんが、ヒープ ウォーカで確認することができます。
原因
MFC 2.0 内で、ハンドルは 一時的に使用されるテンポラリ オブジェクトと ハンドルが開放されるまで保持しているパーマネント オブジェクトの 2 つにアタッチされています。
パーマネント オブジェクトからハンドルがデタッチされるとき、テンポラリ オブジェクトからもハンドルはデタッチしています。その結果、テンポラリ オブジェクトが削除できなくなります。
解決方法
以下の手順でハンドル デタッチ時のテンポラリ マップ (m_tempraryMap) からの削除を回避できます。
-
以下の行を WINHAND.CPP 158行目から削除またはコメントにしてください。
(WINHAND.CPP は \MSVC\MFC\SRC に有ります。)
m_temporaryMap.RemoveKey ((MAPTYPE)h);
-
WINHAND.CPP の145行目と173行目の ASSERT マクロを変更してください。
変更前
ASSERT(ph[0] == h);
変更後
ASSERT(ph[0] == h || ph[0] == NULL);
-
上記の変更後、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