gsoap内存泄漏C应用程序

时间:2017-06-17 10:31:31

标签: gsoap

我们正在为运行Blackfin的Linux实现的C客户端和服务器web服务使用gsoap。

我们不会在应用程序中使用任何malloc。但我们看到内存使用量随着时间的推移而攀升我们正在使用soap_end在通话结束时进行清理。但是当调用反复调用内存使用量慢慢增加时,可能是因为内存碎片化。这也影响了系统的性能

什么是gsoap的首选用法,其中soap_malloc使用不多。例如:如果我们使用静态数组等会有帮助吗?

谢谢,

NKR

1 个答案:

答案 0 :(得分:2)

我不建议使用静态数据,没有必要。

要调试内存使用,请使用-DDEBUG编译所有源文件。运行应用程序时,您将看到三个文件:

  • SENT.log发送的消息
  • RECV.log收到的消息
  • TEST.log调试日志

TEST.log可用于检查邮件问题。

在运行时生成的其他有价值的信息是与代码中损坏(例如溢出)的内存泄漏或堆内存相关的错误消息。这些不太可能在gSOAP引擎中发生,但更好的检查。

确保妥善分配和取消分配托管数据:

soap_destroy(soap);
soap_end(soap);

我正在使用自动生成的函数来分配托管数据:

SomeClass *obj = soap_new_SomeClass(soap);

并偶尔使用soap_malloc进行原始托管分配,或者分配指针数组或C字符串:

const char *s = soap_malloc(soap, 100);

但更好的是用以下内容分配字符串:

std::string *s = soap_new_std__string(soap);

和数组可以用第二个参数分配,例如一个包含10个字符串的数组:

std::string *s = soap_new_std__string(soap, 10);

所有托管分配都会被soap_destroy()后跟soap_end()删除。之后,您可以再次开始分配并再次删除等。

如果您想保留以这些调用方式删除的数据,请使用:

soap_unlink(soap, obj);

现在可以使用obj删除delete obj。但请注意,objsoap_destroy()之后soap_end()中指向托管数据的所有指针成员都已无效。因此,您可能必须对这些成员调用soap_unlink()或冒险悬挂指针。

gSOAP的一个新酷炫功能是自动为任何数据结构生成深度复制和删除功能,从而节省了大量的编码时间:

SomeClass *otherobj = soap_dup_SomeClass(NULL, obj);

这会将obj复制到非托管堆空间。这是一个深层副本,用于检查对象图中的周期并删除此类周期以避免删除问题。您还可以使用soap而不是NULL来为soap_dup_SomeClass的第一个参数复制整个(循环)托管对象到另一个上下文。

深度删除:

 soap_del_SomeClass(obj);

这会删除obj,但也会删除其成员指向的数据,依此类推。

要使用soap_dup_Xsoap_del_X函数,请分别使用soapcpp2选项-Ec-Ed

原则上,静态和堆栈分配的数据也可以序列化。但请考虑使用托管堆。

希望这有帮助。