我们正在为运行Blackfin的Linux实现的C客户端和服务器web服务使用gsoap。
我们不会在应用程序中使用任何malloc。但我们看到内存使用量随着时间的推移而攀升我们正在使用soap_end在通话结束时进行清理。但是当调用反复调用内存使用量慢慢增加时,可能是因为内存碎片化。这也影响了系统的性能
什么是gsoap的首选用法,其中soap_malloc使用不多。例如:如果我们使用静态数组等会有帮助吗?
谢谢,
NKR
答案 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
。但请注意,obj
和soap_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_X
和soap_del_X
函数,请分别使用soapcpp2选项-Ec
和-Ed
。
原则上,静态和堆栈分配的数据也可以序列化。但请考虑使用托管堆。
希望这有帮助。