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 );
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);