在c++中記憶體分配方式有三種:
在我之前總結的c語言思維導圖中可以看出,c語言中,申請動態記憶體主要有三種方式:除此之外,在c++中還引入了new/delete關鍵字來申請動態空間
但是已經有了malloc/free,為什麼我們還要使用new/delete呢?
malloc()與free是c/c++中的標準庫函式,new/delete是c++中的運算子,他們都可用於申請和釋放動態記憶體但是對於非內部資料型別的物件而言,光用malloc()/free()是無法滿足動態物件的要求:物件在建立(銷毀)的同時要自動呼叫構造(析構)函式,但是由於malloc()/free()是庫函式,不再編譯器的許可權範圍內,不能把呼叫構造/析構的任務強加給它們,因此c++需要乙個能夠完成動態記憶體分配和初始化工作的運算子new和能夠釋放記憶體的運算子delete
注:delete和free都只是釋放了記憶體,並沒有刪除指標本身
new和delete的使用比malloc()/free()簡單許多
1.只申請乙個記憶體空間:new/delete
2.申請多個記憶體空間:new /delete
void
test()
new和delete是使用者進行動態記憶體申請和釋放的操作符,operator new 和operator delete是系統提供的全域性函式*,new在底層呼叫operator new全域性函式來申請空間,delete在底層通過operator delete全域性函式來釋放空間通過上述兩個全域性函式的實現知道,operator new 實際也是通過malloc來申請空間,如果malloc申請空間成功就直接返回,否則執行使用者提供的空間不足應對措施,如果使用者提供該措施就繼續申請,否則就拋異常。operator delete最終是通過free來釋放空間的。
注意:
operator new和operator delete使用者也可以自己實現
使用者實現時即可實現成全域性函式,也可實現成 類的成員函式
但是一般情況下不需要實現,除非有特殊需求。
new和delete的實現原理:
一、內建型別:
如果申請的是內建型別的空間,new和malloc,delete和free基本類似,不同的地方是:new/delete申請和 釋放的是單個元素的空間,new和delete申請的是連續空間,而且new在申請空間失敗時會拋異常, malloc會返回null。二、自定義型別:
new的原理 :1. 呼叫operator new函式申請空間
2. 在申請的空間上執行建構函式,完成物件的構造
delete的原理 :
1. 在空間上執行析構函式,完成物件中資源的清理工作
2. 呼叫operator delete函式釋放物件的空間
new t[n]的原理 :
1. 呼叫operator new函式,在operator new中實際呼叫operator new函式完成n個物件空間的申請
2. 在申請的空間上執行n次建構函式
delete[ ]的原理 :
1. 在釋放的物件空間上執行n次析構函式,完成n個物件中資源的清理
2. 呼叫operator delete[ ]釋放空間,實際在operator delete[ ]中呼叫operator delete來釋放空間
malloc/free和new/delete的共同點是: 都是從堆上申請空間,並且需要使用者手動釋放。
不同的地方是:
malloc和free是函式,new和delete是操作符
malloc申請的空間不能初始化,new可以初始化
malloc申請空間時,需要手動計算空間大小並傳遞,new只需在其後跟上空間的型別即可
malloc的返回值為void*, 在使用時必須強轉,new不需要,因為new後跟的是空間的型別
malloc申請空間失敗時,返回的是null,因此使用時必須判空,new不需要,但是new需要捕獲異常
malloc/free只能申請內建型別的空間,不能申請自定義型別的空間,因為其不會呼叫構造與析構函式, 而new可以,new在申請空間後會呼叫建構函式完成物件的構造, delete在釋放空間前會呼叫析構函式 完成空間中資源的清理
new/delete比malloc和free的效率稍微低點,因為new/delete的底層封裝了malloc/free
class
test
//c++11
//告訴編譯器將該函式刪除
test
(const test& data)
=delete
;private
:test
(int data)
//c++98
//test(const test& data);
//1、只宣告不定義 2、宣告成私有
int _data;
};
C 之動態記憶體管理
想必很多學習c 的人都有很深厚的c語言基礎.在c語言中,我們是用malloc,calloc,realloc三位男士和free一位女士來動態管理記憶體的 先coding一下c語言的基本動態記憶體管理模式 void rammanagebyc 然而這種初始化方式是有很大的缺陷的 首先它的初始化非常的難受,...
C 記憶體管理之四 動態記憶體管理
三 new delete拓展 四 記憶體耗盡怎麼辦 new delete與malloc free都是用於管理動態記憶體。其中malloc free是c標準庫函式,用於c程式的動態記憶體管理 new delete是c 的運算操作符,用於動態記憶體管理,功能完全覆蓋malloc free。new new...
C 動態記憶體 學習筆記
string ps new string ps指向乙個動態分配的,初始化為空string的物件 int pi newint pi指向乙個動態分配,未初始化的int物件int pi newint 1024 string ps newstring 10 9 vector int pv new vecto...