Memory leaks 如何在调用gsoap代理后释放内存 我继承了一些C++代码,使用gSOAP生成的代理调用SOAP服务。代码的目的是从Web服务检索一些数据。我正在工作的代码是在Linux上运行的,Web服务是Windows服务。功能正常-我正在获取数据。但当我用valgrind运行它时,它显示出严重的韭葱。别犹豫。当我查看响应结构的定义时,我发现它由许多指针组成,我看不到这些指针在哪里被释放

Memory leaks 如何在调用gsoap代理后释放内存 我继承了一些C++代码,使用gSOAP生成的代理调用SOAP服务。代码的目的是从Web服务检索一些数据。我正在工作的代码是在Linux上运行的,Web服务是Windows服务。功能正常-我正在获取数据。但当我用valgrind运行它时,它显示出严重的韭葱。别犹豫。当我查看响应结构的定义时,我发现它由许多指针组成,我看不到这些指针在哪里被释放,memory-leaks,gsoap,Memory Leaks,Gsoap,我试着以一种天真而直接的方式释放它们,比如deleteporfree(p)。结果valgrind开始报告我有不匹配的删除。我看了一下stackoverflow和Genevia,找不到任何明确的答案。我还尝试使用soap_destroy函数,但它并没有消除我的漏洞 我使用gsoap代理的主要函数(节略)如下所示: bool ParcDataSvcProxy::GetTradingHours(vector<TradingHours>& tradingHours, vector&l

我试着以一种天真而直接的方式释放它们,比如deleteporfree(p)。结果valgrind开始报告我有不匹配的删除。我看了一下stackoverflow和Genevia,找不到任何明确的答案。我还尝试使用soap_destroy函数,但它并没有消除我的漏洞

我使用gsoap代理的主要函数(节略)如下所示:

bool ParcDataSvcProxy::GetTradingHours(vector<TradingHours>& tradingHours, vector<int>& filter, string& errorMessage)
{
    tradingHours.clear();
    BasicHttpBinding_USCOREIParcDataServiceProxy proxy;
    struct soap * soap_ptr = proxy.soap;
    soap_set_version(soap_ptr, 1);
    proxy.soap_endpoint = _url.c_str();
    _ns1__GetTradingHours* req = new _ns1__GetTradingHours();
    int *sourceId = NULL;
    req->sourceID = sourceId;
    _ns1__GetTradingHoursResponse response;
    try
    {
        int  ret = proxy.GetTradingHours(req, response);
        int cnt = response.GetTradingHoursResult->TradingHours.size();
        for (int ni = 0; ni < cnt; ni++)
        {
            TradingHours xyz;
            auto trhour = response.GetTradingHoursResult->TradingHours[ni];
            // do something with data
        }
    }
    catch (exception& ex)
    {
        errorMessage = "Error in GetTradingHours. url=";
        errorMessage += proxy.soap_endpoint;
        errorMessage += " ";
        errorMessage += ex.what();
        delete req;
        return false;
    }
    soap_destroy(soap_ptr);
    soap_destroy(response.soap);
    return true;

}
所以,问题是:有没有办法以简单的方式释放我的响应对象。
非常感谢您的帮助。

在调用
soap\u destroy()
之后,您需要调用
soap\u end()
从gsoap管理的内存中删除反序列化的POD结构。<代码> SoPaBebug()/Cuth.Car只删除托管内存中分配的C++对象:

    soap_destroy(soap_ptr);
    soap_end(soap_ptr);
    soap_destroy(response.soap);
    soap_end(response.soap);
    proxy.destroy();
以上是C风格的函数调用。另外,在C++中使用<代码>毁灭()//>代码方法,该方法在引擎上下文中调用<代码> SOAPMeXMyDyE()/<代码>和<代码> SOAPJEN()/<代码>:

    soap_ptr->destroy();
    response.soap->destroy();
最后,我应该指出
soap\u ptr
response.soap
是相同的,因为
response.soap
引擎上下文指针设置为
proxy.soap
,因为这是反序列化数据的代理。因此,您只需调用
proxy.destroy()
即可释放托管内存:

    soap_destroy(soap_ptr);
    soap_end(soap_ptr);
    soap_destroy(response.soap);
    soap_end(response.soap);
    proxy.destroy();
如果在销毁数据之前需要保留任何数据,请使用soapcpp2生成的深度复制函数和方法,使用soapcpp2选项
-Ecd
。有关详细信息,请参阅:


非常感谢您的帮助。成功了。几乎。。。valgrind仍然报告24个字节肯定丢失。无法找出泄漏的原因。protobuf是否分配一些全局内存?非常感谢您的帮助。成功了。几乎。。。出于某种原因,它没有发布请求(req)。所以我不得不“手动”完成:删除req->soap;删除请求->源ID;删除请求;我很好奇是否有更“高级”的方法来删除请求。但总的来说,问题已经解决了——再次感谢你。Alex RE博士,非常感谢你的帮助。多亏了你的提示,我最后一个没有发布请求的问题很简单。我没有意识到,在gsoap中,我们不仅仅做新的或malloc。当我更改我的_ns1__GetTradingHours*req=new _ns1__GetTradingHours()时;to u ns1_uuugettradinghours*req=soap_new_uuuns1_uuugettradinghours(soap_ptr);一切都开始好起来了