##乾貨: c與c++中的動態記憶體深度剖析
一點整理,希望對你有幫助。。。
c語言中分為在堆或者棧中進行動態記憶體管理,首先堆上開闢空間通常使用malloc/calloc/realloc三個函式,使用free將申請的空間釋放掉。
三個函式返回值均為void*,三個函式區別在於其引數不同,如下:
p=(in*)malloc(sizeof(int));//位元組數
p = (int*) calloc (n,sizeof(int));//元素個數,位元組數且元素初始化為0
p= (int*)realloc(ptr,sizeof(int));//指標,位元組數,指標為空則malloc,非空則擴容。
注意:使用malloc/calloc/realloc則必須使用free來釋放記憶體,否則會造成記憶體洩漏。
其次,在棧上使用_alloca動態記憶體開闢,棧上記憶體由編譯器自動維護,不需要使用者顯示釋放 。
c++中包容了c中原有的管理方式,也提出了自己的記憶體管理方式:new和delete運算子。
注意:new和delete不是函式,是操作符。
// 動態申請乙個int型別的空間
int* ptr1 = new int;
// 動態申請乙個int型別的空間並初始化為10
int* ptr2 = new int(10);
// 動態申請10個int型別的空間
int* ptr3 = new int[3];
new與delete的剖析:
new()–>operator new()–>malloc()–>建構函式–>return ptr
//new操作符通過呼叫operator new()函式進行申請空間與初始化,operator new()先呼叫malloc函式申請空間,再呼叫建構函式初始化物件,本質上operator new()是malloc()的封裝
與其對應的使delete(),注意的使new和delete一定是搭配使用的,delete()則負責釋放空間清理物件
delete()–>析構函式–>operator delete()->free()
//operator delete()則顯然是free()的封裝,operator delete()先呼叫析構函式進行清理工作,再呼叫free()釋放空間
new[count]和delete[count]:
申請count大小的陣列空間與清除,也就是在new()時呼叫count次的建構函式,在delete()時呼叫count次的析構函式,其核心本質和new /delete是相同的
c 中的動態陣列使用
c 的new操作符是該語言乙個非常好的語法特性,然而實際使用中卻發現new操作符有不少限制,為突出的一點便是用new操作符分配多維陣列空間時,不能讓陣列的每一維都動態可變。本文將對此提出乙個簡單直觀的解決方案,在乙個實際問題的簡化模型中加以說明,並以此釋清許多初學者對c 中new操作符與多維陣列的誤...
C 中 與 的使用
之前最常用的也就是 最近遇到 和 感覺還是挺有意思的。int?a null 用於定義可空型別和引用型別的預設值。如果此運算子的左運算元不為null,則此運算子將返回左運算元,否則返回右運算元。例如 a b 當a為null時則返回b,a不為null時則返回a本身。string a null strin...
C 中 與 的使用
1 可空型別修飾符 int?a null 2 空合併運算子 用於定義可空型別和引用型別的預設值。如果此運算子的左運算元不為null,則此運算子將返回左運算元,否則返回右運算元。例如 a b 當a為null時則返回b,a不為null時則返回a本身。string a null string b b st...