1

我目前正在使用 gsoap 2.8 版实现 Web 服务并遇到分段错误。

因此,我像这样使用soap_malloc分配内存:

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

OSoap 的源代码是使用 wsdl 生成的,如下所示:

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 指针解决问题

4

3 回答 3

4

好的 - 当使用 std::string* 时,应该使用soap_instantiate_std__stringsoap_malloc在文档中没有找到的,然后一切正常!

于 2013-06-26T14:57:24.340 回答
2

我有同样的问题。我看到你的 std::string* 是一个“可选”属性。在我写了之后:

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

它在标题中更改为 std::string !我不知道您是否使用 xsd 元素,但这是一种很好的方式。

于 2014-10-28T08:34:57.517 回答
0

复杂类型可以通过使用soap_new_XXX函数来实例化,就像soap_new_std__string(soap, 1)在这种情况下一样。该函数在内部调用soap_instantiate_std__string。gsoap 会自动释放内存。

请参阅gsoap 文档第 9.13.1 章内存分配和管理策略。

于 2017-04-13T13:46:50.387 回答