0

プロジェクトの 1 つで Linux で gSOAP を使用していますが、サーバーをかなり長時間使用すると問題が発生します (実際にはそれほど長くはありません。10 時間ほど後にこのエラーが発生します...)。gSOAP でのマルチスレッド化について、ここで少し前に示した例に従いました。SOAP サービスを作成し、copy メソッドを使用してそれをスレッドに渡します。スレッド関数は次のようなものです。

void MyClass::SoapServer(myservice::Service* soapService)
{
    int res = soapService->serve();
    if (res != SOAP_OK)
    {
        // log error
    }
    soapService->destroy();
    soap_free(soapService);
}

数時間後、SOAP 関数を呼び出すコンスタント ポーラーがあると、gSOAP コピー関数でセグメンテーション エラーが発生します。以下に、接続を受け入れてスレッドを作成するコードを添付します。

while(true)
{
    int error = mySoapService.accept();
    if (!soap_valid_socket(error))
{
        //error
    }
    else
    {
        myservice::Service *soapServiceCopy = NULL;
        soapServiceCopy = mySoapService.copy();
        // create thread using the SoapServer function 
        // and pass soapServiceCopy as an argument         
    }
}

ソープ サービスのクリーンアップが正しく実行されているように思えますが、不足しているものはありますか?

ありがとう

4

1 に答える 1

0

リンク先のコードと私の例の違いはsoap_free()、soapService オブジェクトを解放するために使用し、私の例では を使用していることですdelete。サンプル コードを使用するように変更してsoap_free()から valgrind で実行すると、free / delete / delete[] の不一致が報告soap_free()され、free の上に構築されていると思われますが、.copy()メソッドは new を使用してコピーを作成しています。

于 2012-07-23T10:21:29.553 に答える