一、基本用法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++中的內存泄露的方法數組
- [4092] Detected memory leaks!
- [4092] Dumping objects ->
- [4092] strcore.cpp(118) :
- [4092] {73}
- [4092] normal block at 0x00F64950, 21 bytes long.
- [4092] Data: < 8.35> 01 00 00 00 08 00 00 00 08 00 00 00 38 2E 33 35
- 。。。
- [4092] Object dump complete.
普通塊(normal block):是由你的程序分配的內存。
客戶塊(client block):是一種特殊的內存塊,它是由MFC使用的一個對象,程序退出時,該對象的析構函數沒有被調用。MFC new操做符能夠用來建立普通塊和客戶塊。
CRT塊(CRT block):是由C RunTime Library供本身使用而分配的內存塊。CRT庫本身來管理這些內存的分配與釋放,一般你不會在內存泄漏報告中發現有CRT內存泄漏,除非程序發生了嚴重的錯誤(例如CRT庫崩潰)。
ide