一.概述 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);
s PR intf(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获取地址本的实现。

gSOAP中内存的使用相关推荐

  1. Linux中内存buffer和cache的区别

    Linux中内存buffer和cache的区别 分类: LINUX 原文地址:Linux中内存buffer和cache的区别 作者:platinaluo 细心的朋友会注意到,当你在linux下频繁存取 ...

  2. 开发中内存溢出问题及解决

    开发中内存溢出问题及解决 参考文章: (1)开发中内存溢出问题及解决 (2)https://www.cnblogs.com/yangyi1024/p/6417874.html 备忘一下.

  3. gsoap中的数据结构中不允许有野指针

    2019独角兽企业重金招聘Python工程师标准>>> gsoap中的数据结构中不允许有野指针,比如char *p,没有给它赋值,就必须要给其赋值为NULL. 转载于:https:/ ...

  4. C++中内存分配、函数调用和返回值问题

    在谈述函数调用和返回值问题之前,先来看看C++中内存分配的问题. C++编译器将计算机内存分为代码区和数据区,很显然,代码区就是存放程序代码,而数据区则是存放程序编译和执行过程出现的变量和常量.数据区 ...

  5. 查找Linux中内存和CPU使用率最高的进程

    需求:创建一个定时任务,每30分钟输出该时刻(年月日分秒)系统中内存占用最大的四个进程名及进程占用内存 打印当前系统时间(年月日分秒) [root@localhost /]# date "+ ...

  6. 【kernel 中内存分配那点事】

    首先呢作为车载bsp开发人员,写大量的内核代码是不现实的事情,多数都是修修改改,但是要有内核代码阅读浏览理解的能力,毕竟linux kernel 还是很nb 的,所有技术人员深入研究内核代码是必须的, ...

  7. linux用8m内存读取1g日志,检查 Linux 中内存使用状况的 8 条命令

    Linux 并不像 Windows,你常常不会有图形界面可供使用,特别是在服务器环境中.html 做为一名 Linux 管理员,知道如何获取当前可用的和已经使用的资源状况,好比内存.CPU.磁盘等,是 ...

  8. 浅谈C++中内存分配、函数调用和返回值问题

    在谈述函数调用和返回值问题之前,先来看看C++中内存分配的问题. C++编译器将计算机内存分为代码区和数据区,很显然,代码区就是存放程序代码,而数据区则是存放程序编译和执行过程出现的变量和常量.数据区 ...

  9. linux 内存使用原理,linux中内存使用原理

    首先介绍一下linux中内存是如何使用的. 当有应用需要读写磁盘数据时,由系统把相关数据从磁盘读取到内存,如果物理内存不够,则把内存中的部分数据导入到磁盘,从而把磁盘的部分空间当作虚拟内存 来使用,也 ...

最新文章

  1. 几个流行移动前端框架的比较评分
  2. Logging with Log4net (二)
  3. h3c telnet
  4. 时间操作(Java版)—获取给定日期N天后的日期
  5. Spring07----Bean的作用域
  6. 架构语言ArchiMate -应用层(Application Layer)
  7. Contiki Etimer 模块
  8. 三步教会你在solidworks中画铝型材
  9. 如何下载Idea专业版
  10. 大专计算机档案,大专档案自我鉴定(精选5篇)
  11. github-上传本地代码到github仓库
  12. 让天底下没有难接的支付|支付宝网银直连转账到银行卡对接故事续集 支付对接不是一个单纯技术问题 网银直连转账到银行卡开通方式揭晓
  13. 家政预约小程序设计开发(附近师傅+在线抢单服务APP)
  14. 美军马赛克战三大技术优势!融入未来作战还需克服的四大难点
  15. preparestatement中的反射原理_技术文章 |智能网联汽车激光雷达工作原理、性能比较与安全性分析...
  16. 小白兔写话_可爱的小白兔二年级写话
  17. Scala:函数与匿名函数
  18. 苦战金三银四:580道最全面的BATJ大厂Java面试真题分享
  19. 容器深入研究(1):完整的容器分类法、填充容器(上)
  20. Vue3 脚手架创建项目

热门文章

  1. map和reduce
  2. 在双11大促中的数据库服务器
  3. spring事务管理-xml配置aop事务(重点)
  4. 代理模式coding-动态代理
  5. 使用Commons Logging - Java异常处理
  6. final、finally与finalize的区别
  7. php 数组插入键和值,php数组中键和值的关系
  8. 骁龙660_高通骁龙660可以带动6g运行内存吗?
  9. forum.php 重定向,解析php 版获取重定向后的地址(代码)
  10. 【小题目】输入两个数字以及一个符号,输出这两个数字在这个符号下运算产生的结果