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