c 學習筆記之動態記憶體管理 一

2021-09-19 20:49:28 字數 2698 閱讀 8337

在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...