gSOAP中内存的使用

2016-02-19 17:42 50 1 收藏

最近很多朋友喜欢上设计,但是大家却不知道如何去做,别担心有图老师给你解答,史上最全最棒的详细解说让你一看就懂。

【 tulaoshi.com - 编程语言 】


  一.概述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",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", 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端进行非法指针操作检测:
  shellvalgrind ./getmsgserver 8888
  在另外一个终端执行
  shell./getmsgtest 89
  2.对server端进行内存泄漏检测,在main函数的soap_end后面添加一个exit(0),以便观察server接收一次请求后退出的情况,这样可以真实查看内存是否完全释放:
  shellvalgrind --leak-check=yes ./getmsgserver 8888
  在另外一个终端执行
  shell./getmsgtest 89
  3.对server端进行内存检测,是否有些内存没有完全回收:
  shellvalgrind –show-reachable=yes./getmsgserver 8888
  在另外一个终端执行
  shell./getmsgtest 89
  4.对client端进行非法指针操作检测:
  
   shell./getmsgserver 8888
  在另外一个终端执行
  shell valgrind ./getmsgtest 89
  5.对client端进行内存泄漏检测:
  shell./getmsgserver 8888
  在另外一个终端执行
  shellvalgrind --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获取地址本的实现。

来源:https://www.tulaoshi.com/n/20160219/1615877.html

延伸阅读
Objective-C 和 Swift 语言的内存管理方式都是基于引用计数「Reference Counting」的,引用计数是一个简单而有效管理对象生命周期的方式。引用计数分为手动引用计数「ARC: AutomaticReference Counting」和自动引用计数「MRC: Manual Reference Counting」,现在都是用 ARC 了,但是我们还是很有必要了解 MRC。 1. 引用计数的原理是什么? 当...
标签: 电脑入门
内存使用率是根据系统当前运行了多少进程决定的,没运行一个进程就会多占用一些内存,对于Win7系统来说基本上启动之后不加载任何程序的情况就会占用到500M的内存了,如果是旗舰版并开启了界面效果的情况,加上一起其它的驱动程序占用内存到1G很正常。同时一切其它的开机启动程序占用内存等,我的电脑之前也是2G内存,Win7旗舰版开机启动项很多...
http://www.asp888.net 豆腐技术站 这个是我在国外的一个站点上看到的使用Asp.Net得到一些系统变量的程序, 大家可以看看,其实这个程序没有多大的用处,只是说明一下asp.Net 的强大功能而已。 <script language="C#" runat=server void Page_Load(Object sender, EventArgs ev) { ProcessInfo[] history = ProcessModelInfo.GetHistory(10...
Linux的产生与发展,更多的应用与服务器,那么对于Linux的各个管理机制要非常清楚,一个完整的Linux系统主要有存储管理,内存管理,文件系统和进程管理等几方面组成,贴出一些以前学习过的一个很好的文章。与大家共享!以下主要说明Swap和Buffer Cache机制 Linux支持虚拟内存(virtual memory),虚拟内存是指使用磁盘当作RAM的扩展,...
在网上查资料时看到几篇介绍 linux driver 编写的文章,其中提到 kmalloc()与 __get_free_page()返回地址的问题,我们都知道 kmalloc() 与 __get_free_page() 分配的是物理内存,但它返回的到底是什么?那几篇关于驱动编写的文章中提到申请的是物理地址,返回的依然是物理地址。但有一篇文章中,作者 对此提出了质疑,但没有给出答案。这也就...

经验教程

750

收藏

98
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部