2013-06-24 99 views
1

我目前正在使用gsoap版本2.8實現webservice並運行到分段錯誤。將值賦給使用soap_malloc創建的std :: string指針

爲此我使用soap_malloc這樣的分配內存:

OSoap *myObject = (OSoap *)soap_new_OSoap(this); 
myObject->myString = (std::string*)soap_malloc(this, sizeof(std::string)); 

使用WSDL生成OSoap的源代碼,看起來像這樣:

class SOAP_CMAC OSoap { 
... 
public: 
    std::string *myString; // optional attribute 
... 
} 

現在我有一個字符串分配但如何我寫內容給這個字符串?

myObject->myString->insert(0, "123"); 

*(myObject->myString) += "abc"; 

導致段故障。

std::string *abc = new std::string("abc"); 
myObject->myString = abc; 

工作,但產生內存泄漏,我儘量避免。

搜索谷歌或爲計算器如何複製在C++字符串沒有給我一個提示如何使用的std :: string指針

+0

我不知道gSoap,但是在我看來,您正在分配std :: string(在固定的內存分配中),然後插入/附加到字符串的內部內存。當你新建字符串時,你完全控制了對象,它可以工作(但泄漏) - 你可以試驗固定大小的字符數組,然後看看soap_malloc是什麼? (I.E.複製到數組中) – Caribou

+0

固定大小的char數組無效,因爲我需要使用{}對它們進行實例化,char *確實有效。 –

+0

好的 - 我認爲seg故障可能是由於字符串在內部重新分配內存引起的。希望這會讓你更進一步。對不起,我無法提供更多幫助。 – Caribou

回答

3

確定要解決的問題 - 使用std ::時字符串*應使用soap_instantiate_std__string而不是在文檔中找不到的soap_malloc,那麼一切正常!

2

我有同樣的問題。我看到你的std :: string *是一個「可選」屬性。 之後,我寫道:

<xsd:element minOccurs="1" maxOccurs="1" name="myString" type="xsd:string"/> 

它的頭改變爲std :: string! 我不知道你是否使用xsd元素,但這是一種很好的方式。

+0

在我的情況下,不允許更改xsd! –

0

複雜類型可以通過使用soap_new_XXX函數來實例化,如在這種情況下爲soap_new_std__string(soap, 1)。該功能在內部調用soap_instantiate_std__string。內存將由gsoap自動釋放。

請參閱gsoap documentation第9.13.1章內存分配和管理策略。