我有一个soap响应结构,其中包含一个可选的错误参数(我已经将它们缩写为希望它没有创建语法错误)。 这两个类都是由gsoap生成的。
响应对象
class SOAP_CMAC ns1__LoginResponse : public ns1__Response
{
public:
class ns1__Error *Error; /* optional element of type ns1:Error */
int *SessionID; /* SOAP 1.2 RPC return element (when namespace qualified) */ /* optional element of type xsd:int */
public:
virtual int soap_type() const { return 127; } /* = unique type id SOAP_TYPE_ns1__LoginResponse */
virtual void soap_default(struct soap*);
virtual void soap_serialize(struct soap*) const;
virtual int soap_put(struct soap*, const char*, const char*) const;
virtual int soap_out(struct soap*, const char*, int, const char*) const;
virtual void *soap_get(struct soap*, const char*, const char*);
virtual void *soap_in(struct soap*, const char*, const char*);
ns1__LoginResponse() { ns1__LoginResponse::soap_default(NULL); }
virtual ~ns1__LoginResponse() { }
};
错误对象
class SOAP_CMAC ns1__Error : public xsd__anyType
{
public:
std::string *Code; /* optional element of type xsd:string */
std::string *Description; /* optional element of type xsd:string */
public:
virtual int soap_type() const { return 100; } /* = unique type id SOAP_TYPE_ns1__Error */
virtual void soap_default(struct soap*);
virtual void soap_serialize(struct soap*) const;
virtual int soap_put(struct soap*, const char*, const char*) const;
virtual int soap_out(struct soap*, const char*, int, const char*) const;
virtual void *soap_get(struct soap*, const char*, const char*);
virtual void *soap_in(struct soap*, const char*, const char*);
ns1__Error() { ns1__Error::soap_default(NULL); }
virtual ~ns1__Error() { }
};
当我在服务中检测到错误时,我必须分配此ns1__Error对象。
我尝试过使用soap_malloc
ns1__Error* err = (ns1__Error*)soap_malloc(soap_context, sizeof(ns1__Error));
但我意识到这是致命的缺陷。当gsoap稍后调用其中一个对象方法时,它会崩溃。尚未调用对象构造函数。
如果我调用soap_malloc然后使用placement new来调用构造函数然后它可以工作,但我没有地方可以调用析构函数。
void* errmem = soap_malloc(soap_context, sizeof(ns1__Error));
ns1__Error err= new (errmem) ns1__Error();
这不会崩溃但是感觉不对,特别是因为gsoap让我上课并且做了所以我必须自己分配它,但似乎并没有给我一个机制来做到这一点。由于没有调用析构函数,它也会在释放时将我的对象置于可能错误的状态。
有一个关于soap_new_Class函数的讨论(诚然已过时),但我在版本2.8.18中没有看到这一点。
如何进行此分配,以便正确分配,构造和销毁对象,gsoap可以在完成后对其进行清理?
答案 0 :(得分:0)
Gsoap为从wsdl或头文件创建的每种类型定义分配函数。
对于类型X,它将定义类似于
的函数X* soap_new_X(struct soap* s, int num = -1);
编辑:在我不明白soap_new_Class意思是文字函数名称的问题中似乎。
返回类型为X的已分配对象的 num 长度数组(似乎-1是一种特殊情况,这意味着只分配一个对象)。在您的请求被提供后,当您调用 soap_destroy 时,这将包含在要释放的对象的gsoaps内部注册表中。
对于我的错误对象,它看起来像。
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);