C++動態內存管理好難怎麼辦?零基礎圖文講解,小白輕鬆理解原理

首先我們先了解一下內存:

C++動態內存管理好難怎麼辦?零基礎圖文講解,小白輕鬆理解原理
C語言使用malloc/free動態管理內存空間,C++引入了new/delete,new[]/delete[]來動態管理內存。
如果大家在自學C++中遇到困難,想找一個學習C++的環境,可以加入我的C++學習交流扣羣先是513801371,能夠共同學習交流和分享
!![
](https://s1.51cto.com/images/blog/201905/11/f3795621980960d47c291497e516b846.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

介紹new/delete,new[]/delete[]之前我們先了解一下operator new,operator delete,operator new[],operator delete[]函數。

注:這些函數並沒有重載new/delete表達式。

函數聲明如下:

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的一層封裝。

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釋放空間。

C++動態內存管理好難怎麼辦?零基礎圖文講解,小白輕鬆理解原理C++動態內存管理好難怎麼辦?零基礎圖文講解,小白輕鬆理解原理
2>,new[]/delete[]實際上做了什麼事呢??

new[n]:調用operator new分配空間,再調用n次構造函數初始化對象。

delete[n]:調用n次析構函數清理對象,再調用operator delete釋放空間。

C++動態內存管理好難怎麼辦?零基礎圖文講解,小白輕鬆理解原理
爲什麼編譯器會知道調用多少次構造函數,析構函數呢?

原來在new[ ]分配空間的時候會在頭部多分配4個字節來存n,這樣在調用new[]/delete[]時就知道調用幾次構造函數和析構函數了。

new/delete,new[]/delete[]爲什麼要成對出現?

當new在開闢內置類型的空間時,不成對出現是可以的;但是當開闢非內置類型空間時,就要多開闢4個字節,這時如果不成對使用就會造成內存泄漏或者程序崩潰。

C++動態內存管理好難怎麼辦?零基礎圖文講解,小白輕鬆理解原理
用宏模擬實現new[]/delete[]申請和釋放數組

//DELETE_ARRAY參數中傳n

#define NEW_ARRAY(ptr,type,n)

do{

ptr=(type)operatornew(sizeof(type)n);

for (size_t i = 0; i <n;++i)

{

new(ptr+i)type;

}

} while (0);

#define DELETE_ARRAY(ptr,type,n)

do{

for (size_t i = 0; i < n; ++i)

{

(ptr+i)->~String();

}

operator delete ptr;

} while (0);

C++動態內存管理好難怎麼辦?零基礎圖文講解,小白輕鬆理解原理
//給DELETE_ARRAY中不傳n

#define NEW_ARRAY(ptr,type,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);

#define DELETE_ARRAY(ptr,type)

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失敗拋異常。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章