new/delete与malloc/free
C語言中使用malloc/calloc/realloc用來在堆上分配空間,free將申請的空間釋放掉。
malloc:
原型:extern void *malloc(unsigned int num_bytes)。
功能:分配長度為num_bytes字節(jié)的內(nèi)存塊。
1 int *p=(int*)malloc(sizeof(int)); 2 free(p); 3 p=NULLcalloc:
原型:extern void *calloc(int num_elems, int elem_size);
用法:#include <alloc.h>
功能:為具有num_elems個長度為elem_size元素的數(shù)組分配內(nèi)存
1 int *p=(int*)calloc(100,sizeof(int)); 2 free(p); 3 p=NULL;realloc:
原型:extern void *realloc(void *mem_address, unsigned int newsize);
用法:#include <alloc.h>
功能:改變mem_address所指內(nèi)存區(qū)域的大小為newsize長度。
?
1 int *p=(int*)malloc(sizeof(int)); 2 realloc(p,10*sizeof(int)); 3 free(p);?
問題:為什么分配了空間之后,必須要用戶手動去free掉呢?
答案:因為malloc/calloc/realloc都是在堆上分配的,堆上分配的空間必須由用戶自己來管理,如果不釋放,就會造成內(nèi)存泄漏。而棧上分配的空間是由編譯器來管理的,具有函數(shù)作用域,出了函數(shù)作用域后系統(tǒng)會自動回收,不由用戶管理,所以不用用戶顯式釋放空間。
?
C++中是通過new和delete操作符進行動態(tài)內(nèi)存管理的。因為new和delete是操作符,所以可以重載。
用一張圖說明new和delete的含義:
new和delete以及malloc和free一樣,要成對使用。
這是string *s = new string("a value"); 這句表達式內(nèi)部的實現(xiàn):
?
可以得出:
(初始化一個對象時)new內(nèi)部的調(diào)用順序:new —— operator new —— malloc —— 構(gòu)造函數(shù) (先申請空間,再調(diào)用構(gòu)造函數(shù))
(初始化若干個對象時)new內(nèi)部的調(diào)用順序:new —— operator new [ ] —— operator new —— malloc —— 構(gòu)造函數(shù)
(delete單個對象時)delete對象時,調(diào)用順序為:delete —— 析構(gòu)函數(shù) —— operator delete —— free (先調(diào)用析構(gòu)函數(shù),再釋放空間)
(delete多個對象時)delete對象時,調(diào)用順序為:delete [ ] —— 析構(gòu)函數(shù) —— operator delete —— free
?
問題:new和delete與malloc和free都是存在堆上的,二者有什么差別?
答案:
1. 它們都是動態(tài)管理內(nèi)存的入口。
2. malloc/free是C/C++標(biāo)準(zhǔn)庫的函數(shù),new/delete是C++操作符。
3. malloc/free只是動態(tài)分配內(nèi)存空間/釋放空間。而new/delete除了分配空間還會調(diào)用構(gòu)造析構(gòu)函數(shù)進行初始化與清理(清理成員)。
4. malloc/free需要手動計算類型大小且返回值為void*,new/delete可自己計算類型的大小對應(yīng)類型的指針。
5.new/delete的底層調(diào)用了malloc/free。
6.malloc/free申請空間后得判空,new/delete則不需要。
7.new直接跟類型,malloc跟字節(jié)數(shù)個數(shù)。
轉(zhuǎn)載于:https://www.cnblogs.com/WindSun/p/10419299.html
總結(jié)
以上是生活随笔為你收集整理的new/delete与malloc/free的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于兰伯特投影得应用问题
- 下一篇: SLAM系统工程,常用数据集下载链接(T