gsoap初始化釋放 gSOAP中記憶體的使用

2021-10-13 10:24:42 字數 3263 閱讀 3429

一.概述 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端進行非法指標操作檢測:

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的記憶體管理

2.valgrind的主頁

七.備註

在192.168.18.233的/home/weiqiong/soap/getmsg目錄下有本文講到的例子。用法更複雜的例子參見cvs中的xmail/pmd/ws/addrbook目錄下的實現,是從mss獲取位址本的實現

初始化 指定初始化

id alloc 物件的誕生過程,主要是從作業系統獲得一塊足夠大的記憶體,以存放該類的全部例項變數,並將其指定為存放記憶體物件的實力變數的位置。alloc方法同時將這塊記憶體全部設定為0。結果是 bool變數初始化為no,所有的int型別變數為0,float變數為0.0,所有的指標為nil.obje...

初始化 1 預設初始化 列表初始化

初始化的基本概念 事實 初始化和賦值是兩個完全不同的操作。初始化,是建立變數時賦予其乙個初始值。賦值,是把物件的當前值擦除,用乙個新值代替。列表初始化 p39 作為c 11新標準的一部分,用花括號 來初始化變數得到了全面應用。出於某些原因,這種初始化的方式叫做列表初始化。現在,無論是初始化物件還是某...

初始化 MyBatis初始化之載入初始化

在mybatis初始化過程中,大致會有以下幾個步驟 1.建立configuration全域性配置物件,會往typealiasregistry別名註冊中心新增mybatis需要用到的相關類,並設定預設的語言驅動類為xmllanguagedriver 3.構建defaultsqlsessionfacto...