內存泄露對策與調試

一、基本用法c++

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程序員

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

三、檢測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庫崩潰)。

ide

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