我在我的一个项目中使用Linux下的gSOAP,并且在使用服务器很长时间时遇到问题(实际上不是很长,我在10小时之后得到这个错误......)。我跟着前一段时间给出了here的例子,用于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
}
}
在我看来,肥皂服务清理是正确执行的,有什么我想念的吗?
由于
答案 0 :(得分:0)
您链接到的代码和我的示例之间的区别在于您使用soap_free()
释放soapService对象,我的示例使用delete
。更改我的示例代码以使用soap_free()
,然后在valgrind下运行它会导致报告的free / delete / delete []不匹配,这使我认为soap_free()
是建立在free之上但{{1}方法是使用new来创建副本。