內存泄露對策與調試

1、基本用法

malloc/free與new/delete區別
區別:delete/new涵蓋了malloc/free的過程,C程序只能用malloc/free管理動態內存
用法:
int *p1 = (int *)malloc(sizeof(int) * length);//* malloc返回值的類型是void *,所以在調用malloc時要顯式地進行//類型轉換,將void * 轉換成所需要的指針類型。
int *p2 = new int[length];
結論:儘量用new/delete

2、避免內存泄露的對策
1、在使用內存之前檢查指針是否爲NULL。如果指針p是函數的參數,那麼在函數的入口處用assert(p!=NULL)進行
2、如果是用malloc或new來申請內存,應該用if(p==NULL) 或if(p!=NULL)進行防錯處理。
3、無論用何種方式創建數組,都別忘了賦初值,即便是賦零值也不可省略,不要嫌麻煩。
4、使用free或delete釋放了內存後,將指針設置爲NULL。防止產生“野指針”。
5、如果在申請動態內存時找不到足夠大的內存塊,malloc和new將返回NULL指針,宣告內存申請失敗。此時應該用exit(1) 把壞程序殺死,否則可能會害死操作系統。

3、檢測vc++中的內存泄露的方法

利用Debugview軟件檢測數據情況:
Debugview報告說明:
 
  1. [4092] Detected memory leaks!  
  2. [4092] Dumping objects ->  
  3. [4092] strcore.cpp(118) :   
  4. [4092] {73}   
  5. [4092] normal block at 0x00F64950, 21 bytes long.  
  6. [4092] Data: <            8.35> 01 00 00 00 08 00 00 00 08 00 00 00 38 2E 33 35  
  7. 。。。  
  8. [4092] Object dump complete. 
 
說明1:normal block
內存泄漏報告中把每一塊泄漏的內存分爲普通塊、客戶塊和CRT塊。事實上,你只需要留心普通塊和客戶塊類型。
 

普通塊(normal block):是由你的程序分配的內存。
客戶塊(client block):
是一種特殊的內存塊,它是由MFC使用的一個對象,程序退出時,該對象的析構函數沒有被調用。MFC new操作符可以用來創建普通塊和客戶塊。
CRT塊(CRT block):是由C RunTime Library供自己使用而分配的內存塊。CRT庫自己來管理這些內存的分配與釋放,通常你不會在內存泄漏報告中發現有CRT內存泄漏,除非程序發生了嚴重的錯誤(例如CRT庫崩潰)。

下面這兩種類型的內存塊不會出現在內存泄漏報告中:
空閒塊(free block):已經被釋放(free)的內存塊。
忽略塊(Ignore block):是程序員顯式聲明過不要在內存泄漏報告中出現的內存塊。
 
說明2 :(118)
第118行出錯
 
說明3:{73}
"73"是內存分配號,意思是泄漏的內存是你程序中分配的第十八個內存塊:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章