C 記憶體管理之四 動態記憶體管理

2021-09-28 23:30:07 字數 1467 閱讀 7290

三、new / delete拓展

四、記憶體耗盡怎麼辦

new/delete與malloc/free都是用於管理動態記憶體。其中malloc/free是c標準庫函式,用於c程式的動態記憶體管理;new/delete是c++的運算操作符,用於動態記憶體管理,功能完全覆蓋malloc/free。

new / new:完成兩件事,先底層呼叫 malloc 分了配記憶體,然後呼叫建構函式(建立物件)。

delete/delete:也完成兩件事,先呼叫析構函式(清理資源),然後底層呼叫 free 釋放空間。

問題:有了new/delete為什麼還要malloc/free?

因為c++程式經常要呼叫c函式,而c程式只能用malloc/free管理動態記憶體。

相同點:

用於動態申請記憶體和釋放記憶體

不同點:

操作物件不同

對於使用者自定義的物件而言,用malloc/free無法滿足動態管理物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行析構函式。由於malloc/free是庫函式而不是運算子,不在編譯器控制許可權之內,不能夠把執行建構函式和析構函式的任務強加於malloc/free。因此c++需要乙個能完成動態記憶體分配和初始化工作的運算子new,以及乙個能完成清理與釋放記憶體工作的運算子delete

用法不同

1、因為new 內建了sizeof、型別轉換等功能,所以new 會自動計算需要分配的空間. 而malloc需要手動計算.

2、new是型別安全的,而malloc需要強轉.(void* 編譯器無法指出錯誤).

3、new將呼叫建構函式,而malloc不能;delete將呼叫析構函式,而free不能

new / delete / operator new / operator delete / placement new / placement delete

new 操作符做了兩件事情: 1,申請記憶體空間 2,進行初始化

operator new 類似於c中malloc,只負責分配記憶體空間

void *buffer = operator new(sizeof(string));

placement new: 定位new, 用於在給定的記憶體中初始化物件.

已分配好的記憶體可以反覆利用,有效的避免記憶體碎片問題。

如,用operator new分配了記憶體空間,然後後placement new進行初始化

void *buffer = operator new(sizeof(string));

buffer = new(buffer) string(「abc」);

new operator 可以分解 operator new 和 placement new 兩個動作

1、判斷指標是否為null,並用retuen語句終止。

2、判斷指標是否為null,並用exit(1)函式終止。

3、設定new和malloc異常處理函式。_set_new_hander函式為異常處理函式

C 之動態記憶體管理

想必很多學習c 的人都有很深厚的c語言基礎.在c語言中,我們是用malloc,calloc,realloc三位男士和free一位女士來動態管理記憶體的 先coding一下c語言的基本動態記憶體管理模式 void rammanagebyc 然而這種初始化方式是有很大的缺陷的 首先它的初始化非常的難受,...

C 動態記憶體管理

我們都知道在c 中可以用new malloc動態分配記憶體空間,delete free釋放動態開闢的記憶體空間。1.那麼既然c 中有了可以動態開闢記憶體的函式為什麼又要有new delete呢?c 中的malloc free是繼承c語言中的malloc free,它的用法和在c語言中的用法一模一樣。...

C 動態記憶體管理

1 總結並剖析malloc free和new delete之間關係和差異。1 他們都是動態記憶體管理的入口 2 malloc要計算空間大小,返回值要強轉 new自動計算位元組大小,返回值是相應型別的指標 3 malloc只開闢空間 new開闢空間 呼叫建構函式初始化 delete呼叫析構函式清理 釋...