网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > C/C++
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.C语言入门之函数(5).
.用BCB实现禁止用户关闭Window系统.
.Visual FoxPro 9.0更强大了.
.穷举算法解题的一般思路.
.C语言初学者的十八颗“地雷”.
.C++箴言:在资源管理类中准备访问.
.深入浅出话异常.
.将位图旋转90度.
.学用dbx.
.雕虫小计—颜色渐变的进度条.
.浅议C语言中数组和指针的互操作.
.三视图的画法.
.C++操作符重载的变态用途之子类转.
.局部类和嵌套类.
.用游戏串起程序员的基本功之五.
.玩转BCB的IDE,体验ToolsAPI.
../configure make make install分.
.树的生成与遍历.
.C/C++中利用空指针(NULL),提高程.
.C++中控制Windows关机的实用技巧.

gSOAP中内存的使用

发表日期:2008-3-8



  一.概述 2
二.例子程序简要说明 2
三.server端 2
四.client端 3
五.Valgrind的使用 3
六.参考文档 4
七.备注 4

一.概述
在gSOAP的server和client端连接中,内存的处理有些是gSOAP自己处理的,有些需要我们来考虑。本文档主要就其中目前可能碰到的内存问题,做一个简要的介绍及说明。另外,简要介绍了一下内存检测工具valgirnd的使用及注重事项。
二.例子程序简要说明
例子程序实现的是client端传入一个参数num,server端返回一个字符串,是一段不知道多长的buffer,这样需要在server端动态分配空间。这段内存的治理是本文主要讨论的问题。例子的实现可能有些冗余,但是为了说明一些问题,所以做了一些多余的实现。
得到的server端名称为getmsgserver,client端名称为getmsgtest,server启动在8888端口。
三.server端
省略server端的main函数,其功能实现函数如下:
int ns__getmsg(strUCt soap *getmsg_soap, int num, char **msg)
{
//下面这个空间为我们自己分配的空间,所以后来需要用free显式释放,在xmail系统中可能是从mss获取到的一段buffer,例子中的1024是随意填写的
char *a=(char*)malloc(1024);
memset(a, 0, 1024);
sprintf(a, "num=%d\n",num);

//下面这个空间由soap分配,在server端的main函数中由soap_end释放该空间,由soap自己来控制,还可以直接使用*msg = soap_strdup(getmsg_soap, a)实现下面3句话,但是这个函数只适用于char*的拷贝,假如是struct的copy还是使用下面的实现方式
*msg = (char*)soap_malloc(getmsg_soap, 1024);
memset(*msg, 0, 1024);

//将我们的buffer(可能是从mss获取的)拷贝到soap治理的空间中
memcpy(*msg, a, strlen(a));

//释放由我们自己分配的空间
free(a);
return 0;
}
四.client端
client端做了简单的封装,封装后的函数如下:
int getmsg( const char* server, int num, char **msg )
{
struct soap getmsg_soap;
int result = 0;
char *getmsg = NULL;
soap_init(&getmsg_soap);
soap_set_namespaces(&getmsg_soap, getmsg_namespaces);

//下面是从server端获取数据,注重,得到的buffer在调用soap_end后空间就会被释放,所以需要定义变量getmsg,不能直接将参数msg作为此处的最后一个参数。当然,假如是在使用完msg后才调用soap_end,或者不需要将msg传出,此处就可以直接将msg作为最后一个参数。
soap_call_ns__getmsg( &getmsg_soap, server, "", num, &getmsg );
if(getmsg_soap.error)
{
printf("soap error:%d,%s,%s\n", getmsg_soap.error, *soap_faultcode(&getmsg_soap), *soap_faultstring(&getmsg_soap) );
result = getmsg_soap.error;
}

//将从server端得到的buffer转储到msg中
if(getmsg)
{
*msg = strdup(getmsg);
}
soap_end(&getmsg_soap);
soap_done(&getmsg_soap);
return result;
}

这样,调用完函数int getmsg( const char* server, int num, char **msg )后,需要释放最后一个参数的空间,这个与一般的c程序相同。
五.Valgrind的使用
直接在终端键入valgrind,然后回车,可以看见一些帮助,以下是几个常用的选择项,选项可以联合使用:
1. 对server端进行非法指针操作检测:
shell>valgrind ./getmsgserver 8888
在另外一个终端执行
shell>./getmsgtest 89
2. 对server端进行内存泄漏检测,在main函数的soap_end后面添加一个exit(0),以便观察server接收一次请求后退出的情况,这样可以真实查看内存是否完全释放:
shell>valgrind --leak-check=yes ./getmsgserver 8888
在另外一个终端执行
shell>./getmsgtest 89
3. 对server端进行内存检测,是否有些内存没有完全回收:
shell>valgrind –show-reachable=yes./getmsgserver 8888
在另外一个终端执行
shell>./getmsgtest 89
4. 对client端进行非法指针操作检测:

shell>./getmsgserver 8888
在另外一个终端执行
shell> valgrind ./getmsgtest 89
5. 对client端进行内存泄漏检测:
shell>./getmsgserver 8888
在另外一个终端执行
shell>valgrind --leak-check=yes ./getmsgtest 89
6. 对client端进行内存检测,是否有些内存没有完全回收:
shell>./getmsgserver 8888
在另外一个终端执行
shell> valgrind –show-reachable=yes ./getmsgtest 89
六.参考文档
1.gSOAP的内存治理
http://www.cs.fsu.edu/~engelen/soapdoc2.Html#tth_sEc9.13

2.Valgrind的主页
http://valgrind.kde.org/
七.备注
在192.168.18.233的/home/weiqiong/soap/getmsg目录下有本文讲到的例子。用法更复杂的例子参见cvs中的xmail/pmd/ws/addrbook目录下的实现,是从mss获取地址本的实现。
上一篇:x86内联汇编 人气:593
下一篇:C语言编程 人气:722
浏览全部C/C++的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐