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

时间:2014-10-16 06:06:15

标签: c++ memory-management soap gsoap

我有一个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可以在完成后对其进行清理?

1 个答案:

答案 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);