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