new/delete 和malloc/free 的區別一般彙總
http://www.cnblogs.com/biyeymyhjob/archive/2012/07/16/2593754.html
一、基本概念
malloc/free:
1、函式原型及說明:
void *malloc(long NumBytes):該函式分配了NumBytes個位元組,並返回了指向這塊記憶體的指標。如果分配失敗,則返回一個空指標(NULL)。
void free(void *FirstByte): 該函式是將之前用malloc分配的空間還給程式或者是作業系統,也就是釋放了這塊記憶體,讓它重新得到自由。
2.記憶體操作:
malloc函式的引數是接受需要分配的記憶體位元組數,如果記憶體能夠滿足請求量,那麼將會返回:指向被分配的記憶體塊起始位置
free函式釋放的是指標指向的記憶體(不是釋放的指標本身,不會刪除指標本身),其中指標必須指向所釋放記憶體空間的首地址
new/free:
1.操作時發生事件:
new的時候會有兩個事件發生:1).記憶體被分配(通過operator new 函式) 2).為被分配的記憶體呼叫一個或多個建構函式構建物件
delete的時候,也有兩件事發生:1).為將被釋放的記憶體呼叫一個或多個解構函式 2).釋放記憶體(通過operator delete 函式)
2.特殊應用:
使用delete是未加括號,delete便假設刪除物件是單一物件。否則便假設刪除物件是個陣列
因此,如果在呼叫new時使用了[],則在呼叫delete時也使用[],如果你在呼叫new的時候沒有[],那麼也不應該在呼叫時使用[]。
二、malloc/free 和new/delete 的本質區別:
1.malloc/free是C/C++語言的標準庫函式,new/delete是C++的運算子
2.new能夠自動分配空間大小
3.對於使用者自定義的物件而言,用maloc/free無法滿足動態管理物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行解構函式。由於malloc/free是庫函式而不是運算子,不在編譯器控制許可權之內,不能夠把執行建構函式和解構函式的任務強加於malloc/free。因此C++需要一個能對物件完成動態記憶體分配和初始化工作的運算子new,以及一個能對物件完成清理與釋放記憶體工作的運算子delete---簡而言之 new/delete能進行對物件進行構造和解構函式的呼叫進而對記憶體進行更加詳細的工作,而malloc/free不能。
三、聯絡
既然new/delete的功能完全覆蓋了malloc/free,為什麼C++還保留malloc/free呢?因為C++程式經常要呼叫C函式,而C程式只能用malloc/free管理動態記憶體。如果用free釋放“new建立的動態物件”,那麼該物件因無法執行解構函式而可能導致程式出錯。如果用delete釋放“malloc申請的動態記憶體”,理論上講程式不會出錯,但是該程式的可讀性很差。所以new/delete,malloc/free必須配對使用。
四、使用範例
void * malloc(size_t size);
用malloc 申請一塊長度為length 的整數型別的記憶體,程式如下:
int *p = (int *) malloc(sizeof(int) * length);
我們應當把注意力集中在兩個要素上:“型別轉換”和“sizeof”。
1. malloc 返回值的型別是void *,所以在呼叫malloc 時要顯式地進行型別轉換,將void * 轉換成所需要的指標型別。
相關文章
- C malloc() free(), C++ new() delete()C++delete
- new 和 malloc 的區別 及使用
- 細說new和malloc的十大區別
- malloc、calloc和realloc區別
- 在malloc和free上的一天
- PHP new self()和new static()的區別PHP
- delete和truncate刪除的區別delete
- Golang make和new的區別Golang
- JavaScript中的new map()和new set()使用詳細(new map()和new set()的區別)JavaScript
- SQLSERVER 的 truncate 和 delete 有區別嗎?SQLServerdelete
- glibc 2.23 原始碼分析 | malloc & free原始碼
- <七>深入理解new和delete的原理delete
- 【linux】free命令中cached和buffers的區別Linux
- Linux free 命令中cached 和 buffers 的區別Linux
- free 與 CFRelease 的區別
- laravel中delete()方法和destroy()方法的區別Laraveldelete
- Python __new__ 和 __init__ 的區別Python
- StringBuffer類的delete()方法和deleteCharAt()方法的區別delete
- Java常見知識點彙總(⑫)——==和equals的區別Java
- DDK中"checked build"和"free build" 之區別UI
- __new()__ 與 __init()__的區別
- 記憶體(new delete )記憶體delete
- C++記憶體管理:new / delete 和 cookieC++記憶體deleteCookie
- 【C++】C++ new和malloc到底哪裡不一樣C++
- String s = “hello“和String s = new String(“hello“)的區別
- Go 語言 new 和 make 關鍵字的區別Go
- 程式設計中new[]和delete[]應該如何使用?程式設計delete
- 資料庫:drop、truncate、delete的區別資料庫delete
- Python中__new__和__init__的區別與聯絡Python
- 【學習筆記】make 和 new 關鍵字的區別筆記
- Python面試之理解__new__和__init__的區別Python面試
- Golang make和new的區別及實現原理詳解Golang
- 構造器引用和直接用new建立物件區別物件
- new、delete、記憶體分配 的底層原理delete記憶體
- 記憶體分配詳解 malloc, new, HeapAlloc, VirtualAlloc,GlobalAlloc記憶體
- ILSSI認證和一般的證書有什麼區別?
- cookie和session的區別(全面總結)CookieSession
- js中==和===的區別以及總結JS
- 面試題: 資料庫:delete和trancate刪除表記錄的區別面試題資料庫delete