C/C++動態內存管理
- C: malloc、calloc、realloc、free
- C++:new\delete、new[]\delete[]
- malloc/free與new/delete
- 實現NEW_ARRAY/DELETE_ARRAY宏,模擬new[]/delete[]申請和釋放數組。
- operate new/operate delete
malloc、calloc、realloc、free
- void* malloc(size_t size) 在內存堆空間中申請一塊固定大小的空間,返回起始位置指針,沒申請到返回NULL。
- void* calloc (size_t num, size_t size)在內存中申請 個數*類型大小 的數組空間,返回\~\~同上\~\~
- void* realloc(void* memblock, size_t size) 將所傳指針指向的空間調整爲指定大小,返回新空間起始位置。
- free 釋放所指空間。
- malloc、calloc、realloc要分別與free組合使用,避免內存泄漏;要將返回的指針進行強制類型轉換。
new\delete、new[]\delete[]
- new TYPE 在內存中申請一塊 TYPE 類型大小的空間,返回相應類型的指針。並調用構造函數初始化,可以跟 () 傳參初始化。
- delete P 自動識別 *P 類型,調用析構函數並釋放該空間,與new匹配使用。
- new TYPE[N] 在內存中申請 N 塊 TYPE 類型大小的空間,返回 TYPE 型的指針。並調用N次構造函數初始化,悄悄告訴大家:可以跟 {} 傳參初始化。
- delete[] P 自動識別 *P 類型,由編譯器識別並調用 N 次析構函數並釋放該空間,與 new[] 匹配使用。
malloc/free與new/delete
- 都是動態內存管理入口
- malloc/free是C/C++庫函數,new/delete是C++操作符
- malloc/free只負責申請/釋放空間,new/delete還要調用構造/析構函數
- malloc 使用時要自己計算空間大小,返回 void* 指針,使用指針要自己強轉;new 會自己計算空間大小,返回相應類型指針
實現NEW_ARRAY/DELETE_ARRAY宏,模擬new[]/delete[]申請和釋放數組。
#define NEW_ARRAY(P, TYPE, N) \
do{ \
int* P_NEW = (int*)malloc(sizeof(TYPE)*N + 4); \
((int*)P_NEW)[0] = N; \
P = (TYPE*)(P_NEW + 1); \
int I_NEW = 0; \
for (; I_NEW < N; I_NEW++) \
new(P + I_NEW)TYPE; \
} while (false);
#define DELETE_ARRAY(P, TYPE) \
do{\
int n = *((int*)P - 1); \
while (n--)\
(P[n]).~TYPE(); \
free((int*)P - 1); \
} while (false);
- do{}while(false) 是爲了生成一個局部域,定義和使用臨時變量,避免變量重定義。
- 在前面多申請四字節空間保存一個 int 型變量,記錄數組元素個數。
operate new/operate delete
- operate new/operate delete的作用和 malloc/free 的作用完全相同,只是申請或釋放空間。
- new/delete 是通過 operate new/operate delete 來申請/釋放空間的。
- operate new/operate delete 事實上只是 malloc/free 的一層封裝。