日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

gSOAP中内存的使用

發(fā)布時間:2024/4/11 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 gSOAP中内存的使用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
一.概述 2
二.例子程序簡要說明 2
三.server端 2
四.client端 3
五.Valgrind的使用 3
六.參考文檔 4
七.備注 4

一.概述
在gSOAP的server和client端連接中,內(nèi)存的處理有些是gSOAP自己處理的,有些需要我們來考慮。本文檔主要就其中目前可能碰到的內(nèi)存問題,做一個簡要的介紹及說明。另外,簡要介紹了一下內(nèi)存檢測工具valgirnd的使用及注重事項。
二.例子程序簡要說明
例子程序?qū)崿F(xiàn)的是client端傳入一個參數(shù)num,server端返回一個字符串,是一段不知道多長的buffer,這樣需要在server端動態(tài)分配空間。這段內(nèi)存的治理是本文主要討論的問題。例子的實現(xiàn)可能有些冗余,但是為了說明一些問題,所以做了一些多余的實現(xiàn)。
得到的server端名稱為getmsgserver,client端名稱為getmsgtest,server啟動在8888端口。
三.server端
省略server端的main函數(shù),其功能實現(xiàn)函數(shù)如下:
int ns__getmsg(strUCt soap *getmsg_soap, int num, char **msg)
{
//下面這個空間為我們自己分配的空間,所以后來需要用free顯式釋放,在xmail系統(tǒng)中可能是從mss獲取到的一段buffer,例子中的1024是隨意填寫的
char *a=(char*)malloc(1024);
memset(a, 0, 1024);
s PR intf(a, "num=%d\n",num);

//下面這個空間由soap分配,在server端的main函數(shù)中由soap_end釋放該空間,由soap自己來控制,還可以直接使用*msg = soap_strdup(getmsg_soap, a)實現(xiàn)下面3句話,但是這個函數(shù)只適用于char*的拷貝,假如是struct的copy還是使用下面的實現(xiàn)方式
*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端做了簡單的封裝,封裝后的函數(shù)如下:
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端獲取數(shù)據(jù),注重,得到的buffer在調(diào)用soap_end后空間就會被釋放,所以需要定義變量getmsg,不能直接將參數(shù)msg作為此處的最后一個參數(shù)。當(dāng)然,假如是在使用完msg后才調(diào)用soap_end,或者不需要將msg傳出,此處就可以直接將msg作為最后一個參數(shù)。
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轉(zhuǎn)儲到msg中
if(getmsg)
{
*msg = strdup(getmsg);
}
soap_end(&getmsg_soap);
soap_done(&getmsg_soap);
return result;
}

這樣,調(diào)用完函數(shù)int getmsg( const char* server, int num, char **msg )后,需要釋放最后一個參數(shù)的空間,這個與一般的c程序相同。
五.Valgrind的使用
直接在終端鍵入valgrind,然后回車,可以看見一些幫助,以下是幾個常用的選擇項,選項可以聯(lián)合使用:
1. 對server端進行非法指針操作檢測:
shell>valgrind ./getmsgserver 8888
在另外一個終端執(zhí)行
shell>./getmsgtest 89
2. 對server端進行內(nèi)存泄漏檢測,在main函數(shù)的soap_end后面添加一個exit(0),以便觀察server接收一次請求后退出的情況,這樣可以真實查看內(nèi)存是否完全釋放:
shell>valgrind --leak-check=yes ./getmsgserver 8888
在另外一個終端執(zhí)行
shell>./getmsgtest 89
3. 對server端進行內(nèi)存檢測,是否有些內(nèi)存沒有完全回收:
shell>valgrind –show-reachable=yes./getmsgserver 8888
在另外一個終端執(zhí)行
shell>./getmsgtest 89
4. 對client端進行非法指針操作檢測:

shell>./getmsgserver 8888
在另外一個終端執(zhí)行
shell> valgrind ./getmsgtest 89
5. 對client端進行內(nèi)存泄漏檢測:
shell>./getmsgserver 8888
在另外一個終端執(zhí)行
shell>valgrind --leak-check=yes ./getmsgtest 89
6. 對client端進行內(nèi)存檢測,是否有些內(nèi)存沒有完全回收:
shell>./getmsgserver 8888
在另外一個終端執(zhí)行
shell> valgrind –show-reachable=yes ./getmsgtest 89
六.參考文檔
1.gSOAP的內(nèi)存治理
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目錄下有本文講到的例子。用法更復(fù)雜的例子參見cvs中的xmail/pmd/ws/addrbook目錄下的實現(xiàn),是從mss獲取地址本的實現(xiàn)。?

總結(jié)

以上是生活随笔為你收集整理的gSOAP中内存的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。