質問者
OpenDocumentFileの繰り返しでリソースリーク

質問
-
MFCのマルチドキュメントインターフェイスのプログラムを開発しています。
大量のバッチ処理をする必要があるため、OpenDocumentFileとドキュメントのクローズを
数万回繰りしています。
しかし、リソースリークが発生するため、途中で操作不能になってしまいます。
以下の手順で確認できます。
1.プロジェクトの新規作成で、MFCのマルチドキュメントインターフェイスのプログラム Testを作成。
2.CTestAppのメンバーに CMultiDocTemplate *m_pDocTemplate; を追加。
3.CTestApp :: InitInstance()に、AddDocTemplate(pDocTemplate);の下に
m_pDocTemplate = pDocTemplate;
を追加。
4.メニューIDR_MAINFRAMEにTestを追加
5.CMainFrameにメニューTestのハンドラを追加し、以下のように処理を追加。
void CMainFrame :: OnTest()
{
for (int n=0; n<50000; n++)
{
CMultiDocTemplate* pDocTemplate =
((CTestApp*)AfxGetApp())->m_pDocTemplate;
pDocTemplate->OpenDocumentFile(NULL);
CMDIChildWnd* pMDIChildWnd = MDIGetActive();
pMDIChildWnd->MDIDestroy();
}
}
6.ビルドする。
7.プログラムを実行
8.新規作成されたドキュメントウィンドウを閉じる
9.メニューからTestを選択数分後、リーソースリークのため、画面表示が乱れます。
なお、上記サンプルでは5000回ループしていますが、搭載しているメモリによって発生する条件は変ります。
現在、Visual Studio 2005で開発していますが、これはVC6のころからあるバグです。ただ、Windows XP SP1までは大丈夫だったのですが、Windows XP SP2からこの障害が発生するようになりました。Vistaでも発生します。解決方法がなにかありましたらよろしくお願いします。
すべての返信
-
spike777 さんからの引用 MFCのマルチドキュメントインターフェイスのプログラムを開発しています。
大量のバッチ処理をする必要があるため、OpenDocumentFileとドキュメントのクローズを
数万回繰りしています。リソースリークの絡みは分かりませんが、バッチ処理の際にCDocument派生クラスを利用しなければならない理由はあるのですか?
バッチ処理の際に使用しているコードをうまく抽出できればDocumentに頼る必要性がなさそうに見えるのです。
そもそも、CDocumentの生成、破棄の繰り返しを数万回行うという時点で真っ当なやり方ではない気が…。
-
spike777 さんからの引用 実際の処理は、サンプルとはまたく別で、
# そんなことはないような。むしろ、Azuleanさんが、言い間違えているのでは?
spike777 さんからの引用 ドキュメントのオープン&クローズの繰り返しではなく、チャイルドウィンドウのオープン&クローズの繰り返しです。
バッチ処理をする関係上、数万回オープン&クローズを繰りかえす必要があるのです。だから、バッチ処理をするのに、ウィンドウをオープンする必要はないでしょう?
今更、そこまで直している暇がないというのであれば、
・プログラムは、1回だけオープン&クローズして、終了する。
・このプログラムの起動&終了を数万回行うバッチを作成しては?
spike777 さんからの引用 原因はチャイルドウィンドウのオープン&クローズで、僅かにリソースリークしているためのようです。
マイクロソフトさんが直してくれるといいのですが、認識していないようなので、ここに投稿しました。ここは、「ユーザ」のフォーラムです。バグの報告をするところではありません。
バグの報告は、MSにしてください。
-
Tom Yama さんからの引用 # そんなことはないような。むしろ、Azuleanさんが、言い間違えているのでは?
(略)
だから、バッチ処理をするのに、ウィンドウをオープンする必要はないでしょう?
なるほど…、”CDoument”を前面に出したことがまずかったようです。
フォローありがとうございます。
Tom Yama さんからの引用 バグの報告は、MSにしてください。
フォーラムの中では「Visual Studio フィードバック」が該当しますが、ここに報告したからと言って明確に回答が得られるわけではないので、回答や対応を望むのであればサポートを利用してください。
-
# 終わった話なのカナ? ぶり返して申し訳ないですが。
ドキュメントのオーオープン&クローズの繰り返しではなく、チャイルドウィンドウの
オープン&クローズの繰り返しです。
原因がウィンドウの生成, 破棄に伴うことだと想定されるのであれば、デスクトップヒープを
監視するのも原因解決のための1つの手カモしれません。
>> Desktop Heap Monitor Version 8.1
他の方も指摘されていますが、アプリケーションのデザインを見直したほうが無難かと。
仮にバグ報告でバグだと認識されたとしても、修正されるとは限りませんし、結局は
アプリ側の作りを直すべきという指摘を受けそうな気がします。