我目前正在使用gsoap版本2.8实现一个Web服务并遇到分段错误。
因此我使用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;
工作但产生内存泄漏,我试图避免。
搜索google或stackoverflow以了解如何在c ++中复制字符串并没有给我一个提示如何使用std :: string指针解决问题
答案 0 :(得分:3)
好的 - 当使用std :: string *时,我应该使用soap_instantiate_std__string
而不是文档中没有找到的soap_malloc
,那么一切正常!
答案 1 :(得分:2)
我遇到了同样的问题。我看到你的std :: string *是一个"可选"属性。 在我写完后:
<xsd:element minOccurs="1" maxOccurs="1" name="myString" type="xsd:string"/>
它在标题中更改为std :: string! 我不知道你是否使用了xsd元素,但这种方法效果很好。
答案 2 :(得分:0)
复杂类型可以使用soap_new_XXX
函数进行实例化,例如soap_new_std__string(soap, 1)
。此函数在内部调用soap_instantiate_std__string
。记忆将由gsoap自动发布。
参见gsoap documentation章节9.13.1内存分配和管理策略。