2012-07-23 68 views
0

我在我的一個項目中在Linux下使用gSOAP,並且在長時間使用服務器時遇到問題(實際上不是很長,在10小時之後出現此錯誤...)。我跟着前一段時間的例子here在gSOAP中進行多線程。我創建一個soap服務,然後使用copy方法並將它傳遞給一個線程。線程功能是這樣的: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   
    } 
} 

在我看來,肥皂服務清理正確執行,有什麼我失蹤?

感謝

+0

顯示問題的堆棧跟蹤將有助於您正在使用的gsoap的版本以及您正在運行的操作系統的詳細信息。如果可以的話,我會建議在valgrind下運行該程序,並查看報告的內容(如果有的話)。 – Jackson 2012-07-23 09:22:29

+0

gSOAP 2.8.9,CentOS 6 – cpl 2012-07-23 12:16:57

回答

0

您的代碼和我的例子,你鏈接到的區別是,你使用soap_free()來釋放soapService對象和我的例子使用delete。更改我的示例代碼以使用soap_free(),然後在valgrind下運行它會導致釋放/刪除/刪除[]不匹配,這使我認爲soap_free()構建在免費的基礎上,但.copy()方法使用new來創建副本。

+0

我之前使用過delete,但後來我發現soap_free調用了soap_done,這似乎清理了一些東西。當我使用刪除時,我遇到了類似的問題。我會盡量發佈一些細節,但問題是我幾個小時後出現這個錯誤,所以跟蹤並不容易...... – cpl 2012-07-23 12:15:10