C new和delete原理及應用!

2021-09-17 03:28:41 字數 2219 閱讀 2917

c語言中我們在堆上開闢記憶體時,用到的是malloc和free,可是在c++中卻引入了新的開闢記憶體和釋放記憶體的方法,即new和delete。那麼它們之間有什麼不一樣,原理又是怎樣的呢?

一、malloc/free和new/delete的區別?

1、malloc和free是函式,new和delete卻是c++的運算子

2、malloc只能開闢空間,new既能開闢空間還可以初始化。new一次會呼叫一次建構函式,delete一次也會呼叫一次析構函式。

3、malloc記憶體開闢失敗時會返回null指標,但new開闢記憶體失敗時不返回null指標,而是丟擲bad_alloc型別的異常

4、malloc在堆上申請的記憶體是void*型別,需要強轉成自己需要的型別。new則在申請記憶體的時候就已經明確要申請的記憶體型別。

二、c語言中已經有了malloc/free,c++中為什麼還要有new/delete?

1、首先malloc/free,new/delete都可以用於申請動態記憶體和釋放記憶體。對於非內建資料型別的物件而言,malloc/free無法滿足此種動態物件的要求。因為物件在建立的同時會自動呼叫建構函式,消亡之前會自動呼叫析構函式。因為malloc/free是庫函式而不是運算子,不在編譯器控制許可權內,不能把建構函式和析構函式的任務強加於malloc/free。但是c++中new可以完成動態記憶體分配和初始化工作,delete能夠完成清理與釋放記憶體的工作。

2、此時又有了乙個新的問題,既然new/delete的功能可以覆蓋掉malloc/free,為什麼c++中不把malloc/free淘汰掉呢?

因為c++程式經常要呼叫c函式,而c程式只能用malloc/free來管理動態記憶體。而且malloc/free,new/delete一定要配對起來使用。如果用free來釋放new出來的記憶體,那麼很有可能因為無法析構new建立的物件來導致程式出錯。如果用delete來釋放malloc申請的動態記憶體,雖然程式不會出錯,但是會導致程式可讀性變差。

三、c++中 new/delete運算子過載

#include#include#includeusing namespace std;

//只負責記憶體開闢

void *operator new(size_t size)

//只負責釋放記憶體

void operator delete(void *ptr)

//只負責記憶體開闢

void *operator new(size_t size)//size_t自己計算size大小

//只負責釋放記憶體

我們可以看到**的執行結果中,每次會呼叫相應的過載函式。而new和delete的過載函式實現則是依賴malloc和free實現的。只是new和delete,不管是申請記憶體還是釋放記憶體,會因為分配物件的記憶體是乙個位元組的指標還是乙個陣列(多個位元組)來呼叫不同的函式。所以new和delete用於申請和釋放乙個位元組的記憶體,而new 和delete 則用於申請和釋放多個位元組的記憶體。但是如果不匹配使用,會造成什麼問題呢?

int main()

如果程式申請的是8個位元組的記憶體,如果執行delete p,則會引起程式崩潰。

原理如下:

如果用new申請一段記憶體時,記憶體會自動在首部分配4個位元組的空間,用來儲存給多少物件分配了空間,也就是儲存物件的個數。而真正申請到予以使用的記憶體空間則會在這四個位元組之後。

拿上面例子來說,p申請到的是以0x104為起始位址的8個位元組的記憶體,但是會在其首部分配4個位元組的空間用來儲存物件的個數。如果釋放記憶體的時候,執行 delete p; 編譯器在見到運算子的時候,會自動在p的真實位址0x104的基礎上減4的到0x100,然後先釋放p陣列內每個元素的記憶體(0x104、0x108),然後釋放陣列的記憶體(0x100)。

但是如果執行 delete p; 編譯器認為p只是乙個位元組(0x104 - 0x108)的物件,在new的時候不會給它分配4個位元組的記憶體用來儲存物件的個數。所以它直接從0x104釋放記憶體。但是p真實的記憶體空間有12個位元組,所以引起程式崩潰。

C new和delete的使用

new和delete已經完全包含malloc和free的功能,並且更強大 方便 安全。使用動態分配記憶體時不能忘記釋放記憶體,不要忘記出錯處理!下面先看new和delete的基本使用方法。複製 純文字新視窗 include using namespace std intmain 釋放記憶體 dele...

C New和Delete 用法知其然

new和delete都是c 常用關鍵字,但是內部原理著實不簡單,我此篇是站在淺學用之的角度來歸納其表面使用和淺層原理。如果想深入理解這兩個關鍵字我推薦一下這篇部落格 首先在用法明確幾點 1.他們是系統關鍵字。2.他的標準實現在c 標準標頭檔案是 include 實際上引用了的話會間接引用到 3.我們...

C new和delete的用法

對於計算機程式設計而言,變數和物件在記憶體中的分配都是編譯器在編譯程式時安排好的,這帶來了極大的不便,如陣列必須大開小用,指標必須指向乙個已經存在的變數或物件。對於不能確定需要占用多少記憶體的情況,動態記憶體分配解決了這個問題。new和delete運算子是用於動態分配和撤銷記憶體的運算子。一 new...