【问题标题】:How to gsoap release memory work in c++ mode?如何在 c++ 模式下 gsoap 释放内存?
【发布时间】:2014-08-14 05:25:35
【问题描述】:

我使用 gsoap 为我的 Web 服务生成一些类,在破坏我的类时我没有看到任何免费或删除语句,我必须手动删除类的成员吗? ——或者gsoup的destroy函数有负责做吗? 这是我的示例类之一:

class SOAP_CMAC ns2__FirstOfflineReserve
{
public:
    short *consumed;    /* optional element of type xsd:short */
    class ns2__FirstOfflineFood *food;  /* optional element of type ns2:FirstOfflineFood */
    class ns2__FirstOfflineFoodType *foodType;  /* optional element of type ns2:FirstOfflineFoodType */
    int *id;    /* optional element of type xsd:int */
    class ns2__FirstOfflineMeal *meal;  /* optional element of type ns2:FirstOfflineMeal */
    short *remainCount; /* optional element of type xsd:short */
    short *selectedCount;   /* optional element of type xsd:short */
    std::string *serialCard;    /* optional element of type xsd:string */
    std::string *username;  /* optional element of type xsd:string */
    struct soap *soap;  /* transient */
public:
    virtual int soap_type() const { return 36; } /* = unique id SOAP_TYPE_ns2__FirstOfflineReserve */
    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*);
             ns2__FirstOfflineReserve() { ns2__FirstOfflineReserve::soap_default(NULL); }
    virtual ~ns2__FirstOfflineReserve() { }
};

我看到了保持活动肥皂的教程,以便更快地调用 web 服务,就像这个例子

calcProxy calc(SOAP_IO_KEEPALIVE); // keep-alive improves connection performance
   double sum = 0.0;
   double val[] = 5.0, 3.5, 7.1, 1.2 ;
   for (int i = 0; i < 4; i++)
      if (calc.add(sum, val[i], sum))
         return calc.error;
   std::cout << "Sum = " << sum << std::endl;
   return 0;

现在我们不调用soap的destroy函数了,所以我不用担心删除soap对象了?

【问题讨论】:

  • 没有正文回复,这意味着答案是否显而易见?对于我的问题的第 2 部分,如果我在完成后添加 calc.destroy,我会收到一些库问题消息。
  • 通过 valgrind 或其他一些内存检查器运行它,看看您是否在泄漏内存,然后然后开始担心。 gsoap 是一场噩梦,对 C++ 不是很友好。
  • 感谢您的评论,但 valgrind 只说可能不要删除:D,我不能肯定地说。我想在嵌入式系统中运行我的程序,所以我现在很担心:(
  • 好吧,我没有看到 newdelete 一起使用,所以我不确定 delete 应该属于哪里...
  • gsoap 发送指向其函数的指针以创建一个类型,所以我认为它在其函数中是新的,所以我认为当我调用soap destroy 函数时,它可能会清理这个指针,但如果我调用,则在 SOAP_IO_KEEPALIVE破坏分段错误发生:(

标签: c++ gsoap


【解决方案1】:

我使用 gsoap 生成的文件作为 .dll 项目的组件,在 .dll 条目部分我使用了以下内容:

int __stdcall DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH:  

            /* create a soap environment (provides soap services) */
            soap = soap_new();  

            break;
        case DLL_PROCESS_DETACH:  

        /* terminate soap services */
        soap_end(soap);  //discontinue soap services
        soap_free(soap);  //free soap resources  

        break;
    }

    /* Return 1 to indicate successful initialization */
    return 1;
}

这种方法不会导致我出现内存泄漏。你可以在你的 c++ 代码中使用类似这样的东西,不是吗?

【讨论】:

    猜你喜欢
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 2020-09-10
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 2015-09-13
    相关资源
    最近更新 更多