動態記憶體管理

2021-10-21 17:40:36 字數 3360 閱讀 8680

3.operator new和operator delete函式

5.定位new

6.malloc/free和new/delete的區別

c語言管理記憶體的方式在c++中還是可以用的,絕大部分語言是具有包容性的。c++中提出了自己的記憶體管理方式:通過new和delete操作符進行記憶體管理;

更新管理方式是因為針對內建型別c和c++的管理方式沒有區別,針對自定義型別的時候,malloc和free只管開空間和呼叫析構函式。new和delete會進行開空間,調建構函式,調析構函式

1.申請和釋放單個元素空間,使用new和delete操作符,申請和釋放連續的空間,使用new和delete。千萬不能混用,否則會造成程式崩潰。

2.用new申請自定義型別空間的時候,如果不是預設的建構函式,呼叫的時候要自己傳值,並且不可以申請連續的空間

如果申請的是內建型別的空間,new和malloc,delete和free是類似的,不同的地方是:new/delete申請和釋放的是單個元素的空間,new和delete申請的是連續空間,而且new在申請空間失敗時會拋異常,malloc會返回null;

new的原理:

1.呼叫operator new函式申請空間

2.在申請的空間上執行建構函式,完成物件的構造

delete原理:

1.在空間上執行析構函式完成物件中資源的清理工作

2.呼叫operator delete函式釋放物件的空間

new原理:

1.呼叫operator new函式,在operator new中實際呼叫operator new函式完成對n個物件空間的申請

2.在申請的空間上執行n此建構函式

delete原理:

1.在釋放的物件空間上執行n次析構函式,完成n個物件中資源的清理

2.呼叫operator delete釋放空間,實際在operator delete中呼叫operator delete來釋放空間

operator new和operator delete函式是c++申請和釋放記憶體的庫函式,不是new和delete的過載,用法與malloc/free是一樣的

c語言處理錯誤的方式一般是返回錯誤碼,malloc返回零;

c++(物件導向)的處理方式為拋異常,operator new處理錯誤的方式就是拋異常;

operator new可以清晰的知道錯誤在**,malloc則需要自己去查詢

實際中並不會單獨使用operator new,它的存在意義是給new呼叫的

operator new <=> malloc +malloc失敗拋異常(其實operator new 和 operator delect 的底層就是通過malloc和free來實現的)

new <=> operator new +建構函式(new失敗也是需要拋異常的,因此new需要呼叫operator new)

delete<=> 析構函式+operator delete(先呼叫析構函式,因為如果先釋放了,就無法清理物件內部的資源了)

operator delect <=> free(operator delect存在的意義是為了匹配operator new,因為釋放空間是不會失敗的)

當我們需要對乙個類進行頻繁的申請空間的時候(比如鍊錶),對作業系統的干擾會增加,效率也會降低,為了提公升效率出現了池化技術;

即申請的時候給一塊記憶體,減少頻繁申請,這種叫做記憶體池。類似的還有程序池、執行緒池、連線池都可以減少呼叫,減輕對作業系統的負擔;

定位new表示式數在已分配的原始記憶體空間中呼叫建構函式初始化乙個物件,因為建構函式不可以顯示的呼叫(建構函式是定義物件的時候自動呼叫完成初始化的),所以需要借助定位new來進行初始化(析構函式可以顯示呼叫)

new(place_address)type或者new(place_address)type(initializer-list)

place_address必須是乙個指標,initialzer-list是型別的初始化列表

定位new一般是配合記憶體池使用。因為記憶體池分配出來的記憶體沒有初始化,所以如果是自定義型別的物件,需要使用new的定義表示式進行顯示調建構函式進行初始化

共同點:

都是從堆上申請空間,需要使用者手動釋放

不同點:

1.malloc/free是函式,new/delete是操作符

2.malloc申請的空間不會初始化,new可以初始化

3.malloc申請空間的時候,需要手動計算空間大小,new只需要後面跟上空間型別

4.malloc返回值為void*,必須強轉,new不需要,因為new後面跟的是空間型別

5.malloc申請空間失敗時,返回的是null,因此使用必須判空,new不需要,但是new需要捕獲異常

6.申請自定義型別物件時,malloc/free只會開闢空間,不會呼叫構造和析構函式。new/delete會在申請空間後呼叫建構函式完成物件的初始化,和釋放空間前呼叫析構函式完成空間資源的清理

動態記憶體管理

首先應該明白物件的三種內部的儲存方式 自動儲存,靜態儲存,和動態儲存。當執行離開當期程式塊的時候,堆疊指標返回到它進入程式塊 之前的地方,有效的銷毀了那個程式塊的自動變數。重新進入這個塊會再次建立所有的自動變數。靜態物件宣告或者在檔案域中。動態物件是存在系統呼叫 的在執行期中建立並且儲存在堆中,這是...

動態 記憶體管理

定義變數時,必須制定其資料型別和名字。而動態建立物件時,只需指定其資料型別,而不必為該物件命名。取而代之的是,new表示式返回指向新建立物件的指標,我們通過該指標來訪問此物件。int i int pi new int 這個new表示式在自由儲存區中分配建立了乙個整型物件,並返回此物件的位址,並用該位...

動態記憶體管理

c語言使用malloc calloc realloc free進行動態記憶體管理。void test c 通過new和delete動態管理記憶體。new delete動態管理物件。new delete動態管理物件陣列。void test void test int globalvar 1 stati...