none
CSoapWininetClientクラスでリークしている? RRS feed

  • 質問

  • お世話になっております。

    環境はVisualStudio2005です。

    CSoapWininetClientクラスを使用しているのですが、メモリリークを起こしているようで、

    リーク検出ツールを使用すると、リークが検地されます。

    自分で記述したソースには問題が無いようなので、CSoapWininetClientクラスのソースを

    調べてみたところ、以下のことが分かりました。

    また、本クラスの呼び出しは以下のURLに従っています。

    http://msdn2.microsoft.com/ja-jp/library/6xx8z489(VS.80).aspx

    ※ソースはVisualStudio2005インストールフォルダのatlsoap.h記述してあります。

     

     上記URLの手順4でSendRequestメソッドを呼び出しますが、

    ソースを見ると、SendRequest内でConnectToServerメソッドを呼び出しています。

    そして、ConnectToServer内でInternetOpen()APIを呼び出しています。

    InternetOpenで取得したハンドルはInternetCloseHandle()APIで閉じなければいけません。

    しかし、CSoapWininetClientクラスでは、デストラクタでInternetCloseHandle()APIを使用して

    上記ハンドルを閉じていません。

    また、ConnectToServerメソッドで取得したInternetConnect()APIで取得したハンドルも閉じていません。

    リソース開放用のメソッドとしてCleanupClientがありますが、ここでは開放されていません。

     気になるのは、これらのハンドルがpublicに定義されていることなのです。

    普通はprivateに定義し、外部から変更されたりしないようにすると思うのですが。。。

     

     私が作成したアプリでは、CSoapWininetClientクラスのインスタンスを、処理用のメソッドの

    ローカル変数として定義しています。そのため、何度も処理用のメソッドを呼び出すと

    上記の理由でハンドルが閉じられないため、リークしているようです。

     

    これはCSoapWininetClientクラスのバグなのでしょうか?それとも、ハンドルを格納する変数が

    public定義されているのは、自分でハンドルを閉じる必要があるということでしょうか?

     

    この件について、情報をお持ちの方、ご教授お願いいたします。

    2007年8月2日 12:52

すべての返信

  • 解決しましたので報告します。

    原因はCSoapWininetClientクラスのバグのようで、VisualStudio2005のSP1のソースを

    入手し、私の所持しているファイルと比較したところ、デストラクタに解放メソッド(CloseAll()メソッド)

    呼び出しが追加されていました。

     

    結果、SP1を当てることが対策になります。

    2007年8月3日 6:45
  • 実は、HttpOpenRequest で取得した HINTERNET だけ閉じてたら、InternetConnect と InternetOpen で取得した HINTERNET は閉じる必要がない、という仕様だったりして。

     

    ところで、メモリリークと上記のようなハンドルのリークは別物だと思うのですが、使っているツールでは上記ハンドルがリークしたと出ているのでしょうか?

    2007年8月3日 6:46