三、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呼叫析構函式清理 釋...