IPMI經驗教訓(C記憶體洩露教訓)

2021-07-02 17:28:11 字數 3101 閱讀 5351

乙個由c/c++編譯的程式占用的記憶體分為以下幾個部分

棧區(stack)―  由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。

堆區(heap) ―  一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由os** 。注意它與資料結構中的堆是兩回事,分配方式倒是類似於鍊錶。

全域性區(靜態區)(static)―,全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域, 未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。 - 程式結束後有系統釋放

文字常量區  ―常量字串就是放在這裡的。 程式結束後由系統釋放

程式**區―存放函式體的二進位制**。

1.      malloc()

的空間必須用

free()

函式進行釋放,否則會發生記憶體洩露 如:

fun()

fun()問:

是不是第2種方式開闢的空間在函式結束後如果不free  這個空間不釋放? 第1種方式在函式結束後會釋放空間?

答:

第二種是在堆上分配的空間,在函式結束後不會釋放,需要手動free,程式結束時也會釋放.

第一種是在棧上分配的,函式結束會自動**資源

2.      用來接收內部函式返回的字串,字串長度較確定的可以直接使用字元陣列,陣列的長度最好用定義的巨集,方便以後的修改和維護。

如:tchar  *lpwszstr=null; //pointer to a buffer that receives the translated string

tchar  lpwszstr[cmd_line_len]=;/ /pointer to a buffer that receives the translatedstring

3.      被調函式中申請的區域性變數、陣列的空間在被調函式返回結束時會被釋放掉,用呼叫函式的傳進來的指標去指向這段空間是錯誤的。

如:intsdk_get_online_mac(char* ip_online,char*ipmi_user,char* ipmi_pass,char **online_mac)

char *szbuffer[10];//a buffer that receives the return string

for(i=0;i<10;i++)

szbuffer[i]=(char*)malloc(szbuffer_length);

if (null == szbuffer[i])

//(應考慮到本次申請失敗,把本次之前申請的空間釋放掉)

returnipmi_sdk_malloc_err;

memset(szbuffer[i],0,szbuffer_length);

*online_mac=szbuff[i];//(可以,

malloc

的空間一直都在,除非手動釋放或程式)結束)

char szbuffer[pipe_str_frequency][pipe_str_len]=;//a buffer receives thereturn string

*online_mac=szbuff[i];//(不可以,陣列空間在棧區,函式結束會釋放空間,會使*online_mac指向非法空間,解決辦法如下:

intsdk_get_online_mac(char* ip_online,char*ipmi_user,char* ipmi_pass,char *online_mac)

char szbuffer[pipe_str_frequency][pipe_str_len]=;//a buffer receives thereturn string

memcpy(online_mac, zbuffer [3],ipmi_str_len);//把字串拷貝到

online_mac

指向的空間

總結:傳參型別char **buf,

一般用於需在被調函式中申請空間的函式。

4.      定義的變數、指標、陣列等要進行初始化。

5.      要考慮到程式可能執行錯誤的情況,返回規範的錯誤碼。

6.      為方便程式的除錯,應加上一些規範的列印資訊

如:printf("%s, line:%d,matchfail!\n", __function__, __line__);//加上函式名、行號等

__function__、__line__:c編譯器提供的預定義巨集。

7.      **要及時的測試其正確性、實用性。

8.      主動讓別人檢查自己**的規範性,有無錯誤、漏洞。

9.      c的應用,注意字串操作函式的應用

如:strcpy();拷貝時注意拷貝的字串長度最大為空間長度-1,為『\0』,留出空間

typedef int(*fun_sdk_getautheddevicelist)(char* ipmiuser, char* ipmipass,

char*startip, char* endip, char* mask, datalist** res);//定義函式指標型別

intsdk_getautheddevicelist_stub(char*ipmiuser, char* ipmipass,

char*start_ip, char* end_ip, char* mask, datalist** res, int* result)

fun_sdk_getautheddevicelistfun = null;//用定義的函式型別,定義函式指標變數

char*funname = ipmi_sdk_fun_name_authed_dev_list;

fun= (fun_sdk_getautheddevicelist)getprocaddress(ipmi.hsdkdll, funname);

if(null != fun)

*result= fun(ipmiuser, ipmipass, start_ip, end_ip, mask, res);

returnipmi_srv_ok;

else

dbg("%s_stub(0x%x):sdk(%s) is null", funname, ipmi_srv_get_sdk_function_err, funname);

returnipmi_srv_get_sdk_function_err;

MySQL經驗教訓

mysql語句如下 select buyer id from baoxian.bc insurance order where id in 100000422,100000418,100000417,100000416,100000415,100000413,100000411,100000410,...

CSS 經驗教訓 IE HACKs

1 在ie下最外層邊框無顏色。table td,table th 解決辦法 對table本身也要設定顏色 table,table td,table th 2 字型顯示不正常。h5 在ie中對中文將使用arial 找不到,所以用宋體 其他瀏覽器中文使用 微軟雅黑 英文使用arail 解決辦法 h5 3...

程式設計經驗教訓總結

1 新建的專案工程,其路徑最好不要有中文,避免編譯出錯 2 對於有多個標頭檔案的專案,每個標頭檔案最好使用 ifndef define.endif 以避免重複定義出錯 3 新建結構體 類時一定要記得在結尾處加上封號,不然會報錯 4 對於乙個能正常執行的專案,如果要對其加以修改,最好在動工之前拷貝乙份...