C語言中new與malloc的區(qū)別詳解
1.new的定義
new是運算符,可以用于動態(tài)分配。如果想要撤銷內(nèi)存使用delete。new運算符使用的一般格式為new類型,用new分配數(shù)組空間時不能指定初值。如果由于內(nèi)存不足等原因而無法正常分配空間,則new會返回一個空指針NULL,用戶可以根據(jù)該指針的值判斷分配空間是否成功。一般來說,使用new申請空間時,是從系統(tǒng)的“堆”(heap)中分配空間,申請所得的空間的位置時根據(jù)當時的內(nèi)存的實際使用情況決定的。但是,在某些特殊情況下,可能需要在程序員指定的特定內(nèi)存創(chuàng)建對象,這就是所謂的“定位放置new”(placement new)操作。例如:
int *p=new int(6);
2.malloc的定義
malloc的全稱是memory allocation,中文叫動態(tài)內(nèi)存分配,用于申請一塊連續(xù)的指定大小的內(nèi)存塊區(qū)域以void*類型返回分配的內(nèi)存區(qū)域地址,當無法知道內(nèi)存具體位置的時候,想要綁定真正的內(nèi)存空間,就需要用到動態(tài)的分配內(nèi)存,且分配的大小就是程序要求的大小。(來源百度百科)
void *malloc(int size);
3.new與malloc的區(qū)別
3.1屬性方面
new是關鍵字,需要編譯器支持;malloc是庫函數(shù),需要頭文件支持。
3.2參數(shù)方面
new申請內(nèi)存無需指定內(nèi)存大小,編譯器會根據(jù)類型信息自行計算。除此之外,new會調(diào)用構造函數(shù)。
int* p=new int;//分配大小為sizeof(int)的空間 int* p=new int(6);//分配大小為sizeof(int)的空間,并且初始化為6
malloc必須由我們計算需要申請的字節(jié)數(shù),需要顯式指出所需內(nèi)存的尺寸,并且返回后強行轉換為實際類型的指針。而且malloc只管分配內(nèi)存,并不能對所得的內(nèi)存進行初始化,所以得到的一片新內(nèi)存中,其值是隨機的。
int* p=(int)malloc(sizeof(int)100);//分配可以放下100個int的內(nèi)存空間
3.3處理數(shù)組方面
new有處理數(shù)組的new[],使用new[]分配的內(nèi)存必須使用delete[]進行釋放。
int* ptr=new int[100];//分配100個int的內(nèi)存空間
malloc要想動態(tài)分配一個數(shù)組的內(nèi)存,需要我們手動定義數(shù)組的大小。使用malloc分配內(nèi)存必須使用free來釋放內(nèi)存。
int* p=(int)malloc(sizeof(int)100);//分配可以放下100個int的內(nèi)存空間
3.4返回類型
new分配成功返回的是對象類型指針,與對象嚴格匹配,無類型轉換,所以new是符合類型安全性操作符;malloc返回值類型是void*,一般需要接強制類型轉換成我們需要的類型。
3.5分配失敗方面
new內(nèi)存分配失敗的時候,拋出bad_ alloc異常 ;malloc分配內(nèi)存失敗時返回NULL。
3.6自定義類型方面
new會先調(diào)用operator new函數(shù),申請足夠的內(nèi)存,然后調(diào)用類型的構造函數(shù),初始化成員變量,最后返回自定義類型指針。delete先調(diào)用析構函數(shù),然后調(diào)用operator delete函數(shù)釋放內(nèi)存。 malloc是庫函數(shù),只能動態(tài)地申請和釋放內(nèi)存,無法強制要求其做自定義類型對象構造和析構函數(shù)。
3.7重載方面
new可以重載,malloc不可以重載。 opeartor new /operator delete可以被重載。標準庫是定義了operator new函數(shù)和operator delete函數(shù)的8個重載版本,如下圖所示:
//這些版本可能拋出異常 void * operator new(size_t); void * operator new[](size_t); void * operator delete (void * )noexcept; void * operator delete[](void *0)noexcept; //這些版本承諾不拋出異常 void * operator new(size_t ,nothrow_t&) noexcept; void * operator new[](size_t, nothrow_t& ); void * operator delete (void *,nothrow_t& )noexcept; void * operator delete[](void *0,nothrow_t& )noexcept;
我們可以自定義上面函數(shù)版本中的任意一個,前提是自定義版本必須位于全局作用域或者類作用域中。
3.8內(nèi)存區(qū)域方面
new在自由儲存區(qū)分配內(nèi)存,malloc在堆上分配內(nèi)存。 自由存儲區(qū)(free store)是C++中通過new和delete動態(tài)分配和釋放對象的抽象概念,通過new來申請的內(nèi)存區(qū)域可稱為自由存儲區(qū),通過delete歸還內(nèi)存。特別的,new甚至可以不為對象分配內(nèi)存,定位new的功能可以做到這一點:
new (place_address) type
堆(heap)C語言和操作系統(tǒng)的術語,堆是操作系統(tǒng)所維護的一塊特殊內(nèi)存,它提供了動態(tài)分配的功能,當運行程序調(diào)用malloc()時就會從中分配,調(diào)用free()歸還內(nèi)存。 一般情況下,所有的C++編譯器默認使用堆來實現(xiàn)自由存儲,運算符new和delete內(nèi)部默認是使用malloc和free的方式來被實現(xiàn)。
3.9內(nèi)存泄漏方面
內(nèi)存泄漏對于new和malloc都能檢測出來,new可以明確指出是哪個文件的哪一行,但是malloc不可以明確指出是哪個文件的哪一行。
3.10效率方面
new是關鍵字,malloc是庫函數(shù),new的效率高于malloc。 new和malloc都可用于申請動態(tài)內(nèi)存和釋放內(nèi)存。對于非內(nèi)部數(shù)據(jù)類型的對象而言,光用maloc/free無法滿足動態(tài)對象的要求。對象在創(chuàng)建的同時要自動執(zhí)行構造函數(shù),對象在消亡之前要自動執(zhí)行析構函數(shù)。由于malloc/free是庫函數(shù)而不是運算符,不在編譯器控制權限之內(nèi),不能夠把執(zhí)行構造函數(shù)和析構函數(shù)的任務強加于malloc/free。 C++語言需要一個能完成動態(tài)內(nèi)存分配和初始化工作的運算符new,以及一個能完成清理與釋放內(nèi)存工作的運算符delete。所以說new的效率高于malloc。
4.總結
到此這篇關于C語言中new與malloc的區(qū)別詳解的文章就介紹到這了,更多相關C語言new與malloc的區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C/C++實現(xiàn)高并發(fā)http服務器的代碼示例
這篇文章簡單給大家介紹了C/C++實現(xiàn)高并發(fā)http服務器的代碼示例,文章通過代碼和圖文介紹的非常詳細,感興趣的同學可以參考閱讀2023-07-07