gSOAP中内存的使用

2016-02-19 17:42 58 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获取地址本的实现。

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

延伸阅读
在网上查资料时看到几篇介绍 linux driver 编写的文章,其中提到 kmalloc()与 __get_free_page()返回地址的问题,我们都知道 kmalloc() 与 __get_free_page() 分配的是物理内存,但它返回的到底是什么?那几篇关于驱动编写的文章中提到申请的是物理地址,返回的依然是物理地址。但有一篇文章中,作者 对此提出了质疑,但没有给出答案。这也就...
在.NET中,内存管理是自动进行的。内存的再收集属于后台任务,这使开发者们更专注于手边的工作。在这篇文章中,我们来看一看为开发者提供帮助并且控制垃圾收集的接口。   处理设计模式( Dispose design pattern): IDisposable, Dispose, Finalize   共同语言运...
手机大师内存优化如何使用?   如果想要自己的手机更流畅的话就一定要内存优化,这样手机才不会太卡,当你在玩游戏或者上网前,先使用手机大师内存优化下会使上网玩游戏更流畅,手机过热优化下,这样也能使手机电池寿命更长,今天小编就大家手机大师内存优化如何使用。 1)首先打开手机大师,在界面点击,点击,便会自动优化内存...
Every so often people ask me the question how should they estimate memory consumption by MySQL Server in given configuration. What is the formula they could use. 经常有人问我配置MySQL时该如何估算内存的消耗。那么该使用什么公式来计算呢? The reasons to worry about memory usage are quite understandable. If ...
Objective-C 和 Swift 语言的内存管理方式都是基于引用计数「Reference Counting」的,引用计数是一个简单而有效管理对象生命周期的方式。引用计数分为手动引用计数「ARC: AutomaticReference Counting」和自动引用计数「MRC: Manual Reference Counting」,现在都是用 ARC 了,但是我们还是很有必要了解 MRC。 1. 引用计数的原理是什么? 当...

经验教程

811

收藏

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