C/C++動態內存管理

1:總結並剖析malloc/free和new/delete之間關係和差異。
2:剖析new/delete、new[]/delete[]到底做了些什麼事情。
3:實現NEW_ARRAY/DELETE_ARRAY宏,模擬new[]/delete[]申請和釋放數組。

C動態內存管理

C語言使用malloc/realloc/calloc/free進行動態內存管理

realloc=>指針給空時,與malloc作用一樣void *realloc( void *memblock, size_t size );

calloc開空間,初始化void *calloc( size_t num, size_t size );

malloc負責開空間void *malloc( size_t size );

關於malloc函數的用法

C++動態內存管理

C++通過new和delete動態管理內存
new/delete動態管理對象
new[]/delete[]動態管理數組

注意:malloc/free,new/delete,new[]/delete[]一定要匹配使用,否則可能出現內存泄漏甚至崩潰的問題


1:總結並剖析malloc/free和new/delete之間關係和差異。
相同點:都是動態內存管理的入口
不同點:1)malloc和free是C/C++中的標準庫函數,new和delete是C++的運算符。
2 ) malloc失敗後返回值爲0,而new失敗後會拋異常。
3)new返回指定類型的指針並且可以自動計算所需大小;而 malloc 則必須要由我們計算字節數,並且在返回後強行轉換爲實際類型的指針。

//new/delete
    int *p;
    p = new int;   //返回類型爲int *類型,分配的大小爲sizeof(int)
    p = new int[100];    //返回類型爲int *類型,分配的大小爲sizeof(int) * 100

//malloc/free
    int* p;
    p = (int *)malloc(sizeof(int)* 128);//分配128個(可根據實際需要替換該數值)整型存儲單元,並將這128個連續的整型存儲單元的首地址存儲到指針變量p中    
    double *pd = (double *)malloc(sizeof(double)* 12);//分配12個double型存儲單元,並將首地址存儲到指針變量pd中 

2:剖析new/delete、new[]/delete[]到底做了些什麼事情。
new/delete
這裏寫圖片描述
new —>調用operator new()分配空間
—>調用構造函數初始化對象
delete—>調用析構函數進行清理工作
—>調用operator delete()釋放空間

new[]/delete[]
這裏寫圖片描述
new[N] —>調用operator newN分配空間
—>調用N次構造函數分別初始化對象
delete[N]—>調用N次析構函數進行清理工作
—>operator deleteN釋放空間
3:實現NEW_ARRAY/DELETE_ARRAY宏,模擬new[]/delete[]申請和釋放數組。
模擬實現NEW

#define NEWARRAY(PTR,TYPE, N)                 \
do                                            \
{                                             \
    PTR = (TYPE*)operator new(sizeof(TYPE)*n) \
for (size_t i = 0; i < n; ++i)                \
    new(PTR + i)TYPE;                         \
}while (false);

模擬實現DELETE

#define DELETEARRAY(PTR,TYPE)                 \
do                                            \
{                                             \
    size_t N = *((int*)PTR - 1);              \
    for (size_t i = 0; i < ; ++i)             \
        PTR[i].~TYPE();                       \
    PTR = (TYPE*(char*)PTR - 4;               \
    operator delete(PTR);                     \
} while (false);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章