首先咱們先了解一下內存:
C語言使用malloc/free動態管理內存空間,C++引入了new/delete,new[]/delete[]來動態管理內存。數組
介紹new/delete,new[]/delete[]以前咱們先了解一下operator new,operator delete,operator new[],operator delete[]函數。函數
注:這些函數並無重載new/delete表達式。
最後,若是你們若是在自學遇到困難,想找一個C++的學習環境,能夠加入咱們的C++學習圈,點擊我加入吧,會節約不少時間,減小不少在學習中遇到的難題。學習
函數聲明以下:spa
void* operator new(size_t size);指針
void operator delete(size_t size);對象
void* operator new[](size_t size);圖片
void operator delete[](size_t size);內存
析:operator new/operator delete,operator new[]/operator delete[]是標準庫函數,用法和malloc/free的用法同樣,只負責分配/釋放空間,但實際上operator new/operator delete只是malloc/free的一層封裝。get
new/delete:動態管理對象;編譯器
new[]/delete[]動態管理對象數組。
int* ptr1=new int;//動態分配4個字節的空間
delete ptr;
int* ptr2=new int(4);//動態內存分配4個字節空間並初始化
delete ptr2;
int* ptr3=new int[4];//動態內存分配16個字節空間
delete[];
1>,new/delete實際上作了什麼事呢??
new:先調用operator new分配空間,再調用構造函數初始化空間。
delete:先調用析構函數清理對象,再調用operator delete釋放空間。
2>,new[]/delete[]實際上作了什麼事呢??
new[n]:調用operator new分配空間,再調用n次構造函數初始化對象。
delete[n]:調用n次析構函數清理對象,再調用operator delete釋放空間。
爲何編譯器會知道調用多少次構造函數,析構函數呢?
原來在new[ ]分配空間的時候會在頭部多分配4個字節來存n,這樣在調用new[]/delete[]時就知道調用幾回構造函數和析構函數了。
new/delete,new[]/delete[]爲何要成對出現?
當new在開闢內置類型的空間時,不成對出現是能夠的;可是當開闢非內置類型空間時,就要多開闢4個字節,這時若是不成對使用就會形成內存泄漏或者程序崩潰。
用宏模擬實現new[]/delete[]申請和釋放數組
//DELETE_ARRAY參數中傳n
do{
ptr=(type)operatornew(sizeof(type)n);
for (size_t i = 0; i <n;++i)
{
new(ptr+i)type;
}
} while (0);
do{
for (size_t i = 0; i < n; ++i)
{
(ptr+i)->~String();
}
operator delete ptr;
} while (0);
C++動態內存管理好難怎麼辦?零基礎圖文講解,小白輕鬆理解原理
//給DELETE_ARRAY中不傳n
do{
ptr = (type)operator new(sizeof(type)n + 4); //給n也分配空間
(int)ptr = n;
ptr=(type)((char)ptr+4);
for (size_t i = 0; i < n; ++i)
{
new(ptr + i)(type);
}
} while (0);
do{
size_t n = ((int)ptr - 1);
for (size_t i = 0; i < n; ++i)
{
(ptr + i)->~String();
}
operator delete(char*(ptr - 4));
} while (0);
malloc/free和new/delete之間關係和差別
C++動態內存管理好難怎麼辦?零基礎圖文講解,小白輕鬆理解原理
關係:都能進行動態內存管理。
差別:1>,malloc/free是標準的庫函數, new/delete是操做符;
2>,malloc/free只是分配/釋放內存 ,new/delete不只分配/釋放內存還調用構造函數初始化和析構函數清理;
3>,malloc/free手動計算類型大小,返回值void*,new/delete自動計算類型大小,返回對應類型的指針;
4>,malloc/free失敗返回0, new/delete失敗拋異常。