C/C++動態內存管理

C/C++動態內存管理

  1. C: malloc、calloc、realloc、free
  2. C++:new\delete、new[]\delete[]
  3. malloc/free與new/delete
  4. 實現NEW_ARRAY/DELETE_ARRAY宏,模擬new[]/delete[]申請和釋放數組。
  5. 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 的一層封裝。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章