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++中的內存泄露的方法
- [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庫崩潰)。
空閒塊(free block):已經被釋放(free)的內存塊。
忽略塊(Ignore block):是程序員顯式聲明過不要在內存泄漏報告中出現的內存塊。