none
OpenDocumentFileの繰り返しでリソースリーク RRS feed

  • 質問

  • 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でも発生します。

    解決方法がなにかありましたらよろしくお願いします。

    2008年1月26日 2:55

すべての返信

  •  spike777 さんからの引用

    MFCのマルチドキュメントインターフェイスのプログラムを開発しています。
    大量のバッチ処理をする必要があるため、OpenDocumentFileとドキュメントのクローズを
    数万回繰りしています。

    リソースリークの絡みは分かりませんが、バッチ処理の際にCDocument派生クラスを利用しなければならない理由はあるのですか?

    バッチ処理の際に使用しているコードをうまく抽出できればDocumentに頼る必要性がなさそうに見えるのです。

     

    そもそも、CDocumentの生成、破棄の繰り返しを数万回行うという時点で真っ当なやり方ではない気が…。

    2008年1月26日 5:41
    モデレータ
  • 実際の処理は、サンプルとはまたく別で、ドキュメントのオーオープン&クローズの繰り返しではなく、チャイルドウィンドウのオープン&クローズの繰り返しです。
    原因がどこにあるか判らなかったので、それを調べるために作成したプログラムが記載したサンプルです。
    原因はチャイルドウィンドウのオープン&クローズで、僅かにリソースリークしているためのようです。
    マイクロソフトさんが直してくれるといいのですが、認識していないようなので、ここに投稿しました。
    バッチ処理をする関係上、数万回オープン&クローズを繰りかえす必要があるのです。

     

    2008年1月26日 8:08
  •  spike777 さんからの引用

    実際の処理は、サンプルとはまたく別で、

    # そんなことはないような。むしろ、Azuleanさんが、言い間違えているのでは?

     

     spike777 さんからの引用

    ドキュメントのオープン&クローズの繰り返しではなく、チャイルドウィンドウのオープン&クローズの繰り返しです。
    バッチ処理をする関係上、数万回オープン&クローズを繰りかえす必要があるのです。

    だから、バッチ処理をするのに、ウィンドウをオープンする必要はないでしょう?

     

    今更、そこまで直している暇がないというのであれば、

    ・プログラムは、1回だけオープン&クローズして、終了する。

    ・このプログラムの起動&終了を数万回行うバッチを作成しては?

     

     spike777 さんからの引用

    原因はチャイルドウィンドウのオープン&クローズで、僅かにリソースリークしているためのようです。
    マイクロソフトさんが直してくれるといいのですが、認識していないようなので、ここに投稿しました。

    ここは、「ユーザ」のフォーラムです。バグの報告をするところではありません。

    バグの報告は、MSにしてください。

    2008年1月26日 12:02
  •  Tom Yama さんからの引用

    # そんなことはないような。むしろ、Azuleanさんが、言い間違えているのでは?

    (略)

    だから、バッチ処理をするのに、ウィンドウをオープンする必要はないでしょう?

    なるほど…、”CDoument”を前面に出したことがまずかったようです。

    フォローありがとうございます。

     

     Tom Yama さんからの引用

    バグの報告は、MSにしてください。

    フォーラムの中では「Visual Studio フィードバック」が該当しますが、ここに報告したからと言って明確に回答が得られるわけではないので、回答や対応を望むのであればサポートを利用してください。

    2008年1月26日 12:18
    モデレータ
  • 「Visual Studio フィードバック」を知りませんでした。

    そちらへ書き込みます。

    ありがとうございました。

     

    2008年1月27日 6:58
  • # 終わった話なのカナ? ぶり返して申し訳ないですが。

     

    ドキュメントのオーオープン&クローズの繰り返しではなく、チャイルドウィンドウの

    オープン&クローズの繰り返しです。

    原因がウィンドウの生成, 破棄に伴うことだと想定されるのであれば、デスクトップヒープを

    監視するのも原因解決のための1つの手カモしれません。

     

    >> Desktop Heap Monitor Version 8.1

    > http://www.microsoft.com/downloads/details.aspx?familyid=5cfc9b74-97aa-4510-b4b9-b2dc98c8ed8b&displaylang=en

     

    他の方も指摘されていますが、アプリケーションのデザインを見直したほうが無難かと。
    仮にバグ報告でバグだと認識されたとしても、修正されるとは限りませんし、結局は
    アプリ側の作りを直すべきという指摘を受けそうな気がします。

    2008年1月28日 3:49