2

私は gSOAP ドキュメントを読み、soap_destroy(soap) や soap_end(soap) などを呼び出す必要があるという事実についての言及を見てきましたが、それらは常にサービス オブジェクトに対する単一の呼び出しの例です。私が使用しているサービスは、呼び出しごとに約 40KB のテキストを返します。私の問題は、メモリ使用量がリクエストごとにほぼ同じサイズだけ直線的に増加することです。getWords 内に soap_destroy(service->soap) を追加しましたが、役に立ちませんでした。このコード スニペットに欠けているクリーンアップ コードを誰か指摘できますか? 要求しているプログラムは何日も続けて実行する必要があるため、シャットダウン時よりも要求ごとのクリーンアップが心配です。

http://www.webservicex.net/WCF/ServiceDetails.aspx?SID=43に基づいた同様の例 (エラーチェックなし) を以下に投稿しました(テキストのチャンクが返されますよね?)。どんな助けでも大歓迎です!

#include "soapBibleWebserviceSoapProxy.h"
#include "BibleWebserviceSoap.nsmap"
#include <iostream>
extern "C" {
#include <unistd.h>
}

struct Service
{
    BibleWebserviceSoap service;

    std::string getWords(std::string &title, int chapter)
    {   
        _ns1__GetBibleWordsByBookTitleAndChapter req;
        _ns1__GetBibleWordsByBookTitleAndChapterResponse resp;
        req.BookTitle = &title;
        req.chapter   = 1;

        service.__ns2__GetBibleWordsByBookTitleAndChapter(&req, &resp);

        return *(resp.GetBibleWordsByBookTitleAndChapterResult);
    }
};

int main(int argc, char* argv[])
{
    Service s;
    std::string genesis("Genesis");
    for (int i=0; i<360; ++i)
    {   
        sleep(2);
        std::cout << s.getWords(genesis,1) << std::endl;
    }
    return 0;
}
4

1 に答える 1

0

アプリケーションを Valgrind (valgrind.org - 通常は Linux にデフォルトでインストールされます) で実行します。これは、メモリ リークを追跡する最も簡単な方法です。

1,000 回以上の呼び出しを行うと、シャットダウン時にリークが表示されます。シャットダウン時にリークが表示されない場合、一部のリストまたはマップはエントリを収集しますが、シャットダウン時にのみ解放します - この場合は Massif (Valgrind の一部) を使用します - これも優れたツールです。

直接的な答えではありませんが、メモリを消費する割り当てのスタック トレースは、通常、リークの原因を突き止めるのに大いに役立ちます。

于 2010-08-18T09:48:59.677 に答える