gsoap内存管理与释放
(一)gSoap客户端调用WebService完成后注意内存释放顺序
//Soap资源清理
soap_destroy(soap_sp.get()); //清理反序列化的类实例
soap_end(soap_sp.get()); //清理反序列化的数据 (除类实例) 和临时数据清理
soap_done(soap_sp.get()); //重置和分离上下文: 关闭网络连接和删除回调
释放顺序不能错,否则导致内存泄露
(二)gsoap内存管理
gsoap分配的内存在内部有一个链表维护,在调用soap_destroy时会释放所有手动分配的内存,因此你无需释放内存,只需要检查soap_malloc成功与否就可以了.
如果你只用soap_malloc分配内存,并且发生了内存泄露且值是一个比较大的值时,请检查你使用soap_malloc分配的内存使用时是否越界.如发生越界行为,将无法释放soap.
/*************************************************************************************
* 内存分配函数
*/
//分配指定大小的内存
void * soap_malloc(struct soap *soap, size_t n)
//复制字符串
char * soap_strdup(struct soap *soap, const char *s)
//复制宽字节字符串
char * soap_wstrdup(struct soap *soap, const wchar_t *s)
//创建一个soap对象,并使用默认值初始化.仅C++,C不适用
T * soap_new_T(struct soap *soap)
//创建指定大小soap对象数组,并使用默认值初始化.n=-1时只创建一个soap对象,仅C++,C不适用
T * soap_new_T(struct soap *soap, int n)
//其它不常用就不写了
/*************************************************************************************/ /*************************************************************************************
* 释放资源函数
*/
//删除所有上下文管理的对象,实际上就是删除soap_malloc分配的内存资源.必须在soap_end之前调用,适用于C和C++
void soap_destroy(struct soap *soap)
//清理反序列化的数据和临时数据(不包含上下文管理的对象),适用于C和C++
void soap_end(struct soap *soap)
//删除临时数据但保持反序列化的数据不变,适用于C和C++,不常用
void soap_free_temp(struct soap *soap)
//提前释放你用内存分配函数(如soap_malloc)分配的内存,适用于C和C++.你不释放也没关系,调用soap_destroy时也会释放
void soap_dealloc(struct soap *soap, void *p)
//从gsoap上下文管理对象断开p对象,此时p对象必须由你手动调用free释放,适用于C和C++.
int soap_unlink(struct soap *soap, const void *p)
//完成上下文, 但不删除任何托管对象或数据
void soap_done(struct soap *soap)
//最后确定并释放上下文 (使用 soap _ new 或 soap _ copy 分配的上下文), 但不删除任何托管对象或数据。
void soap_free(struct soap *soap)
/*************************************************************************************/
释放内存正确的姿势
//soap需要复用时的清理方法
#define SE_soap_clear(soap_) do {\
if(NULL!=soap_){\
soap_destroy(soap_);\
soap_end(soap_);\
}\
} while ();
//完全释放soap
#define SE_SAFE_SOAP(soap)\
do {\
if(NULL !=soap) { \
soap_destroy(soap);\
soap_end(soap);\
soap_done(soap);\
soap_free(soap);\
soap= NULL; \
} \
} while () struct soap *ctx = NULL;
char *ptr = NULL; ctx = soap_new1(SOAP_C_UTFSTRING);
//提前释放ptr
ptr = soap_malloc(ctx, );
if(NULL != ptr){
soap_dealloc(ctx, ptr);ptr = NULL;
}
//分离ptr
ptr = soap_malloc(ctx, );
if(NULL != ptr){
soap_unlink(ctx, ptr);
//此时需要手动释放ptr
free(ptr);ptr=NULL;
}
//调用soap_destroy时释放
ptr = soap_malloc(ctx, );
//如果你的ctx需要复用,调用
SE_soap_clear(ctx)
//否则调用
SE_SAFE_SOAP(ctx);
---------------------
转自:https://blog.csdn.net/kmblack1/article/details/84341987
(三)内存管理
C/C++最大的麻烦,也是最大的优点是它要求用户自己管理内存。我们在实现web service方式时,同样需要考虑内存的分配与释放。
分配内存有两类:
- 分配n个字节,采用
void*soap_malloc(struct soap *soap, size_tn)
- 分配某个类,采用
Class*soap_new_Class(struct soap*soap) 一个类
Class*soap_new_Class(struct soap *soap, intn) n个类
这里的类是通讯xml中定义的元素,在response构造时,必然要创建若干此类元素。为简化类的创建,可定义如下宏:
#defineNEW_ELEMENT(classtype) soap_new_##classtype(GetSoapStruct(),-1)
#defineNEW_ELEMENT_X(classtype,n) soap_new_##classtype(GetSoapStruct(),n)
其中 GetSoapSturct()是返回继承的或包含的structsoap结构,对继承方式的代码,它的定义如下:
struct soap *GetSoapStruct() { return(struct soap*)this; }
在我们的Web方法实现中,可以随意使用上面的new方法,在每次web方法完结后,调用soap_destroy(structsoap *soap) ,它会为我们清除掉这部分内存。
gsoap中有若干释放内存的方法,几个有用的函数(还有其它的,忽略)及其说明如下:
|
Function Call |
Description |
|
soap_destroy(struct soap *soap) |
释放所有动态分配的C++类,必须在soap_end()之前调用。 |
|
soap_end(struct soap *soap) |
释放所有存储临时数据和反序列化数据中除类之外的空间(soap_malloc的数据也属于反序列化数据)。 |
|
soap_done(struct soap *soap) |
Detach soap结构(即初始化化soap结构) |
|
soap_free(struct soap *soap) |
Detach 且释放soap结构 |
上表中,动态分配的C++类,指上面用"soap_new"分配的类;临时数据是指那些在序列化/反序列化过程中创建的例如hash表等用来帮助解析、跟踪xml的数据;反序列化数据是指在接收soap过程中产生的用malloc和new分配空间存储的数据。在gsoap中,纯数据空间与类空间管理不同,采用两个方法,可以保留soap的反序列化数据(这时你需要自己释放)。
转自:https://www.cnblogs.com/liushui-sky/p/9723397.html
gsoap内存管理与释放的更多相关文章
- iOS MRC ARC 内存管理
转自:http://www.jianshu.com/p/48665652e4e4 1. 什么是内存管理 程序在运行的过程中通常通过以下行为,来增加程序的的内存占用 创建一个OC对象 定义一个变量 调用 ...
- OC 知识:彻底理解 iOS 内存管理(MRC、ARC)
1. 什么是内存管理 程序在运行的过程中通常通过以下行为,来增加程序的的内存占用 创建一个OC对象 定义一个变量 调用一个函数或者方法 而一个移动设备的内存是有限的,每个软件所能占用的内存也是有限的 ...
- oc56--ARC多个对象的内存管理
// main.m // ARC中多个对象的内存管理:ARC的内存管理就是MRC的内存管理(一个对象释放的时候,必然会把它里面的对象释放),只不过一个是Xcode加的代码,一个是我们自己加的代码: / ...
- python内存管理总结
之前在学习与工作中或多或少都遇到关于python内存管理的问题,现在将其梳理一下. python内存管理机制 第0层 操作系统提供的内存管理接口 c实现 第1层 基于第0层操作系统内存管理接口包装而成 ...
- ARC下的内存管理
1.ARC下单对象内存管理 局部变量释放对象随之被释放 int main(int argc, const char * argv[]) { @autoreleasepool { Person *p = ...
- Objective-C----MRC内存管理 、 自动释放池 、 面向对象三大特性及封装 、 继承 、 组合与聚合
1 MRC练习 1.1 问题 引用计数是Objective-C语言采用的一种内存管理技术,当一个对象被创建在堆上后,该对象的引用计数就自动设置为1,如果在其它对象中的对象成员需要持有这个对象时,则该对 ...
- OC:属性的内部实现原理、dealloc内释放实例变量、便利构造器方法的实现原理、collection的内存管理
代码: // // main.m #import <Foundation/Foundation.h> #import "Person.h" #import " ...
- C语言堆内存管理上出现的问题,内存泄露,野指针使用,非法释放指针
C语言堆内存管理上出现的问题,内存泄露,野指针使用,非法释放指针 (1)开辟的内存没有释放,造成内存泄露 (2)野指针被使用或释放 (3)非法释放指针 (1)开辟的内存没有释放.造成内存泄露,以下的样 ...
- 内存管理概述、内存分配与释放、地址映射机制(mm_struct, vm_area_struct)、malloc/free 的实现
http://blog.csdn.net/pi9nc/article/details/23334659 注:本分类下文章大多整理自<深入分析linux内核源代码>一书,另有参考其他一些资料 ...
随机推荐
- Python特色数据类型(列表)(上)
Python从零开始系列连载(9)——Python特色数据类型(列表)(上) 原创 2017-10-07 王大伟 Python爱好者社区 列表 列表,可以是这样的: 分享了一波我的网易云音乐列表 今天 ...
- Jupyter Notebook 快捷键和技巧
Jupyter Notebook 有两种键盘输入模式. 编辑模式,允许你往单元中键入代码或文本,这时的单元框线是绿色的. 命令模式,键盘输入运行程序命令:这时的单元框线是蓝色. 命令模式 ...
- R图表入门
R图表入门 R语言最强的功能就是统计和作图了,在学习了基本语法之后,博主马上体验了一下R的图表功能 条形图 例1 H = c(7,12,28,3,41) M = c("Mar",& ...
- JAVA自学笔记07
JAVA自学笔记07 1.构造方法 1) 例如:Student s = new Student();//构造方法 System.out.println(s);// Student@e5bbd6 2)功 ...
- CSS关键词的值-currentColor关键字提示文字(当前颜色)
currentColor关键字 currentColor关键字相当于一个CSS变量. currentColor关键字与CSS变量也是有区别的: (1)他只可以能接受<color>值的地方使 ...
- JSP解决:Attempt to clear a buffer that's already been flushed错误(jsp:forward标签跳转空白)
[摘要:本日正在开辟过程当中发明一个题目:正在页里中应用了jsp:forward扔错Attempt to clear a buffer that's already been flushed!! 百思 ...
- pygame 笔记-3 角色动画及背景的使用
上二节,已经知道如何控制基本的运动了,但是只有一个很单调的方块,不太美观,本节学习如何加载背景图,以及角色的动画. 素材准备:(原自github) 角色动画的原理:动画都是一帧帧渲染的,比如向左走的动 ...
- VBA 判断一个TXT编码方式,再创建一个新的文件,复制数据进去
如题,先读取一个文本文件判断编码(Unicode ANSI),就这两种编码然后将txt导入到excel表中,最后处理完成,再创建一个相同编码,不同文件名的txt文件,把新数据放进去 Sub test ...
- 招聘移动APP、接口、自动化、性能和安全方面的兼职测试讲师
只要您在移动APP.接口.自动化.性能和安全方面有丰富的测试经验,我们都欢迎您能加入我们,成为我们的兼职测试讲师,我们可以提供给您一份优厚的薪资,同时能在行业发展.企业培训.授课经验.出版专业著作等方 ...
- ASP.NET Core使用Razor页面
ASP.NET Core使用Razor页面 Razor是ASP.NET的页面引擎,在ASP.NET MVC 3以后被广泛使用,我在之前的博客中有所介绍,需要更多了解的朋友请移步[Razor语法] 在A ...