在C語言中,我們常用malloc、calloc、realloc和free等函數來進行動態內存管理。
但是在C++中,我們則需要用到某些操作符進行動態內存管理。
new / delete —— 動態管理對象
new[] / delete[] —— 動態管理數組
▲new / delete 和 new[] / delete[] 一定要匹配使用!否則會內存泄漏!
void Test1()
{
int* p1 = new int; //創建一個int*類型指針,給指向的空間分配1個int大小的空間
int* p2 = new int(10086); //創建一個int*類型指針,給指向的空間分配1個int大小的空間,並對其指向的空間進行初始化
int* p3 = new int[2]; //創建一個int*類型的指針,給指向的空間分配3個int大小的空間
p3[0] = 1;
p3[1] = 2;
delete p1; //刪除給p1所分配的空間
delete p2; //刪除給p2所分配的空間
delete[] p3; //刪除給p3所分配的空間
}
對C語言有動態內存管理的人可能會有疑惑:明明C語言中已經有 malloc / free 函數進行動態內存管理了,C++又兼容C語言,那爲什麼我們還要使用 new / delete 和 new[] / delete[] 呢?
這要從 new / delete 背後的機制談起了。
在使用new時,編譯器進行兩步操作:
1.調用 std::operator new() 函數進行分配內存(在 operator new 中調用了 malloc()函數)
2.調用被分配類型的構造函數
在使用delete時,編譯器進行兩步操作:
1.調用被分配類型的析構函數
2.調用 std::operator delete() 函數進行釋放內存(在operator delete() 中調用了 free()函數)
在使用new[N]時,編譯器進行兩步操作:
1.調用 std::operator new() 函數進行分配內存(在 operator new 中調用了 malloc()函數)
2.調用N次被分配類型的構造函數
在使用delete[]時,編譯器進行兩步操作:
1.調用N次被分配類型的析構函數
2.調用 std::operator delete() 函數進行釋放內存(在operator delete() 中調用了 free()函數)
整體來說,malloc() 在申請內存時候不會調用構造函數,free() 釋放內存之後也不會調用析構函數,而 new / delete 進行申請 / 釋放內存的時候則會調用,所以簡單的說,在對c++內置類型進行動態內存管理的時候,使用 malloc() / free() 和 new / delete 的差別不大,但是在對用戶自定義類型進行動態內存管理的時候,則必須使用 new / delete 或 new[] / delete[]。
在使用new時,編譯器進行兩步操作:
1.調用 std::operator new() 函數進行分配內存(在 operator new 中調用了 malloc()函數)
2.調用被分配類型的構造函數
在使用delete時,編譯器進行兩步操作:
1.調用被分配類型的析構函數
2.調用 std::operator delete() 函數進行釋放內存(在operator delete() 中調用了 free()函數)