如何在Gsoap中分配C++对象

如何在Gsoap中分配C++对象,c++,memory-management,soap,gsoap,C++,Memory Management,Soap,Gsoap,我有一个soap响应结构,其中包含一个可选的错误参数,我对这些参数进行了缩写,希望它没有产生语法错误。 这两个类都是由gsoap生成的 响应对象 错误对象 当我在服务中检测到错误时,我必须分配这个ns1\uuu错误对象 我试过使用soap\u malloc ns1__Error* err = (ns1__Error*)soap_malloc(soap_context, sizeof(ns1__Error)); 但我意识到这是致命的缺陷。当gsoap稍后调用其中一个objects方法时,它会崩溃

我有一个soap响应结构,其中包含一个可选的错误参数,我对这些参数进行了缩写,希望它没有产生语法错误。 这两个类都是由gsoap生成的

响应对象

错误对象

当我在服务中检测到错误时,我必须分配这个ns1\uuu错误对象

我试过使用soap\u malloc

ns1__Error* err = (ns1__Error*)soap_malloc(soap_context, sizeof(ns1__Error));
但我意识到这是致命的缺陷。当gsoap稍后调用其中一个objects方法时,它会崩溃。尚未调用对象构造函数

如果我调用soap_malloc,然后使用一个新的位置来调用构造函数,那么它可以工作,但是我没有地方调用析构函数

void* errmem = soap_malloc(soap_context, sizeof(ns1__Error));
ns1__Error err= new (errmem) ns1__Error();
这并没有崩溃,但感觉是错误的,特别是当gsoap让我成为了这个类,所以我必须自己分配它,但似乎并没有给我一个机制来做到这一点。它还将使我的对象在释放时处于潜在的错误状态,因为没有调用析构函数

诚然,关于soap_new_类函数的讨论已经过时,但我在版本2.8.18中没有看到这一点


如何进行此分配,以便正确分配、构造和销毁对象,并且gsoap可以在完成后将其清理干净?

gsoap为它从wsdl或头文件创建的每种类型定义一个分配函数

对于类型X,它将定义一个类似于

X* soap_new_X(struct soap* s, int num = -1);
编辑:在这个问题中,我似乎误解了soap_new_类是一个字面函数名

它返回类型为X的已分配对象的num-length数组,这是一种特殊情况,表示只分配一个对象。这包括在gsoaps内部对象注册表中,当您在请求得到服务后调用soap_destroy时,这些对象将被释放

对于我的错误对象,它看起来像

inline ns1__Error * soap_new_ns1__Error(struct soap *soap, int n = -1);
创建了第二个函数

ns1__Error * soap_new_req_ns1__Error(struct soap *soap, int mandatory_param);
这将分配对象,但也允许设置任何强制参数

这些函数原型在SoapH.h中定义。我认为文件名将根据生成代码时传递的参数而改变

要分配一个std::string,这在gsoap中很常见,或者至少在我使用它时,有一个函数

inline std::string * soap_new_std__string(struct soap *soap, int n = -1);

我有一个WSDL对象,它包含非强制BoL字段:gSOAP生成一个C++结构,这个字段带有布尔指针。“但是我找不到任何soap\u new\u std\u bool方法:它期望我使用new bool?”MarcoStramezzi我已经有一段时间没有回答自己的问题了。你当然不应该使用一个新的原始布尔。我不知道该怎么办。也许可以打开生成的代码,寻找适合的函数。否则,可能会有一个通用的分配函数,您可以像c中的malloc一样使用它,只需提供一个大小。
ns1__Error * soap_new_req_ns1__Error(struct soap *soap, int mandatory_param);
inline std::string * soap_new_std__string(struct soap *soap, int n = -1);