0

我在我的一个项目中在 Linux 下使用 gSOAP,并且在使用服务器很长时间时遇到问题(实际上不是很长时间,大约 10 小时后出现此错误......)。我按照前段时间在这里给出的示例进行 gSOAP 中的多线程处理。我创建了一个肥皂服务,然后使用复制方法并将其传递给一个线程。线程函数是这样的:

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 回答