記憶體動態分配與釋放,malloc和new區別
1. C語言的函式malloc和free
(1) 函式malloc和free在標頭檔案<stdlib.h>中的原型及引數
void * malloc(size_t size)
動態配置記憶體,大小有size決定,返回值成功時為任意型別指標,失敗時為NULL。
void free(void *ptr)
釋放動態申請的記憶體空間,呼叫free()後ptr所指向的記憶體空間被收回,如果ptr指向未知地方或者指向的空間已被收回,則會發生不可預知的錯誤,如果ptr為NULL,free不會有任何作用。
(2) C語言中典型用法
T為任意資料型別
T *p = ( T * )malloc( sizeof(T) * n)
if(NULL= =p)
{
printf(“malloc fail!\n”);
……//相關資源收回的處理
exit(-1);
}
… …//此過程不能改變指標p的指向
free(p);
注意:malloc後通常要對返回值進行判斷,避免發生不必要的錯誤。
(3) 記憶體說明
malloc函式動態申請的記憶體空間是在堆裡(而一般區域性變數存於棧裡),並且該段記憶體不會被初始化,與全域性變數不一樣,如果不採用手動free()加以釋放,則該段記憶體一直存在,直到程式退出才被系統,所以為了合理使用記憶體,在不適用該段記憶體時,應該呼叫free()。另外,如果在一個函式裡面使用過malloc,最好要配對使用free,否則容易造成記憶體洩露(沒有將記憶體還給自由儲存區)。
2. C++中的運算子new和delete
new和delete是C++中的運算子,不是庫函式,不需要庫的支援,同時,他們是封裝好的運算子。
(1)new是動態分配記憶體的運算子,自動計算需要分配的空間,在分配類型別的記憶體空間時,同時呼叫類的建構函式,對記憶體空間進行初始化,即完成類的初始化工作。動態分配內建型別是否自動初始化取決於變數定義的位置,在函式體外定義的變數都初始化為0,在函式體內定義的內建型別變數都不進行初始化。
(2)delete是撤銷動態申請的記憶體運算子。delete與new通常配對使用,與new的功能相反,可以對多種資料型別形式的記憶體進行撤銷,包括類,撤銷類的記憶體空間時,它要呼叫其解構函式,完成相應的清理工作,收回相應的記憶體資源。
(3)典型用法
int *p = new int; delete p;
char *p = new char; delete p;
類的型別 *p = new 類的型別; delete p;
//注意,指標p存於棧中,p所指向的記憶體空間卻是在堆中。
Obj * p = new Obj[100]; delete [ ]p;
//注意,new申請陣列,delete刪除的形式需要加括號“[ ]”,表示對陣列空間的操作,總之,申請形式如何,釋放的形式就如何。
(4)記憶體說明。new申請的記憶體也是存於堆中,所以在不需要使用時,需要delete手動收回。
3. new/delete與malloc/free之間的聯絡和區別
(1) malloc/free和new/delete的聯絡
a)儲存方式相同。malloc和new動態申請的記憶體都位於堆中。申請的記憶體都不能自動被作業系統收回,都需要配套的free和delete來釋放。
b)除了帶有建構函式和解構函式的類等資料型別以外,對於一般資料型別,如int、char等等,兩組動態申請的方式可以通用,作用效果一樣,只是形式不一樣。
c)記憶體洩漏對於malloc或者new都可以檢查出來的,區別在於new可以指明是那個檔案的那一行,而malloc沒有這些資訊。
d)兩組都需要配對使用,malloc配free,new配delete,注意,這不僅僅是習慣問題,如果不配對使用,容易造成記憶體洩露。同時,在C++中,兩組之間不能混著用,雖說有時能編譯過,但容易存在較大的隱患。
(2) malloc/free和new/delete的區別
a)malloc和free返回void型別指標,new和delete直接帶具體型別的指標。
b)malloc和free屬於C語言中的函式,需要庫的支援,而new/delete是C++中的運算子,所以new/delete的執行效率高些。C++中為了兼用C語法,所以保留malloc和free的使用,但建議儘量使用new和delete。
c)在C++中, new是型別安全的,而malloc不是。例如:
int* p = new char[10]; // 編譯時指出錯誤
delete [ ]p; //對陣列需要加中括號“[ ]”
int* p = malloc(sizeof(char )*10); // 編譯時無法指出錯誤
free (p); //只需要所釋放記憶體的頭指標
d)使用new動態申請類物件的記憶體空間時,類物件的構建要呼叫建構函式,相當於對記憶體空間進行了初始化。而malloc動態申請的類物件的記憶體空間時,不會初始化,也就是說申請的記憶體空間無法使用,因為類的初始化是由建構函式完成的。delete和free的意義分別於new和malloc相反。
e)不能用malloc和free來完成類物件的動態建立和刪除。
4. C/C++程式的記憶體分配介紹
該部分參考於http://blog.csdn.net/sparkliang/archive/2008/12/30/3650324.aspx
(1)棧記憶體分配運算內建於處理器的指令集中,一般使用暫存器來存取,效率很高,但是分配的記憶體容量有限。一般區域性變數和函式引數的暫時存放位置。
(2)堆記憶體,亦稱動態記憶體。如malloc和new申請的記憶體空間。動態記憶體的生存期由程式設計師自己決定,使用非常靈活。
(3)全域性程式碼區:從靜態儲存區域分配。記憶體在程式編譯的時候就已經分配好,這塊記憶體在程式的整個執行期間都存在。例如全域性變數,static變數。
(4)常量區:文字常量分配在文字常量區,程式結束後由系統釋放。
(5)程式碼區:存放整個程式的程式碼,因為儲存是資料和程式碼分開儲存的。
總結:
相關文章
- 簡單理解動態記憶體分配和靜態記憶體分配的區別記憶體
- malloc和new的區別,new和operator new的區別,分配器介紹
- 記憶體分配詳解 malloc, new, HeapAlloc, VirtualAlloc,GlobalAlloc記憶體
- vector 避免記憶體頻繁分配釋放與手動釋放vector記憶體記憶體
- malloc,calloc,realloc等記憶體分配函式區別記憶體函式
- 二維陣列的動態記憶體分配和釋放 (轉)陣列記憶體
- 記憶體的分配與釋放,記憶體洩漏記憶體
- new 和 malloc 的區別
- new和malloc的區別
- 關於C++ delete 來釋放new分配的記憶體C++delete記憶體
- C語言malloc()函式:動態分配記憶體空間C語言函式記憶體
- 動態記憶體分配記憶體
- c和指標中關於動態分配記憶體malloc和qsort的一個例子指標記憶體
- C/C++——C和C++怎樣分配和釋放記憶體,區別是什麼?C++記憶體
- 簡單分配和釋放記憶體指令碼[更新]記憶體指令碼
- malloc free與new delete的區別和聯絡delete
- new 和 malloc 的區別 及使用
- C/C++使用malloc為結構體陣列分配記憶體(及free釋放記憶體)的三種方法C++結構體陣列記憶體
- 記憶體管理概述、記憶體分配與釋放、地址對映機制(mm_struct, vm_area_struct)、malloc/free 的實現記憶體Struct
- C/C++記憶體分配以及釋放C++記憶體
- new和malloc的地址分配問題
- malloc/free 和 new /delete 的區別 (轉)delete
- C++ 動態記憶體分配C++記憶體
- 動態分配記憶體地址(.NET)記憶體
- C++動態記憶體分配C++記憶體
- 記憶體分配策略中,堆和棧的區別記憶體
- C++ 記憶體分配(new,operator new)詳解C++記憶體
- Vector清空資料與釋放記憶體(.clear與.swap的區別與使用)記憶體
- 關於c語言記憶體分配,malloc,free,和段錯誤,記憶體洩露C語言記憶體洩露
- C語言(動態記憶體分配)C語言記憶體
- Java記憶體區域與分配策略Java記憶體
- Linux釋放記憶體及手動釋放Oracle共享記憶體段Linux記憶體Oracle
- C++ - 二級指標動態記憶體申請與釋放C++指標記憶體
- C++中new與malloc的10點區別C++
- C++ 動態記憶體分配與名稱空間C++記憶體
- javascript堆疊記憶體分配的區別JavaScript記憶體
- 靜態方法和普通的成員方法||分配記憶體空間的區別記憶體
- 細說new和malloc的十大區別