最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言中new與malloc的區(qū)別詳解

 更新時間:2023年10月30日 11:29:49   作者:大慶指針  
這篇文章主要介紹了C語言中new與malloc的區(qū)別詳解,new是運(yùn)算符,可以用于動態(tài)分配,如果想要撤銷內(nèi)存使用delete,new運(yùn)算符使用的一般格式為new類型,用new分配數(shù)組空間時不能指定初值,需要的朋友可以參考下

1.new的定義

new是運(yùn)算符,可以用于動態(tài)分配。如果想要撤銷內(nèi)存使用delete。new運(yùn)算符使用的一般格式為new類型,用new分配數(shù)組空間時不能指定初值。如果由于內(nèi)存不足等原因而無法正常分配空間,則new會返回一個空指針NULL,用戶可以根據(jù)該指針的值判斷分配空間是否成功。一般來說,使用new申請空間時,是從系統(tǒng)的“堆”(heap)中分配空間,申請所得的空間的位置時根據(jù)當(dāng)時的內(nèi)存的實(shí)際使用情況決定的。但是,在某些特殊情況下,可能需要在程序員指定的特定內(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ū)域地址,當(dāng)無法知道內(nèi)存具體位置的時候,想要綁定真正的內(nèi)存空間,就需要用到動態(tài)的分配內(nèi)存,且分配的大小就是程序要求的大小。(來源百度百科)

void *malloc(int size);

3.new與malloc的區(qū)別

3.1屬性方面

new是關(guān)鍵字,需要編譯器支持;malloc是庫函數(shù),需要頭文件支持。

3.2參數(shù)方面

new申請內(nèi)存無需指定內(nèi)存大小,編譯器會根據(jù)類型信息自行計算。除此之外,new會調(diào)用構(gòu)造函數(shù)。

int* p=new int;//分配大小為sizeof(int)的空間
int* p=new int(6);//分配大小為sizeof(int)的空間,并且初始化為6

malloc必須由我們計算需要申請的字節(jié)數(shù),需要顯式指出所需內(nèi)存的尺寸,并且返回后強(qiáng)行轉(zhuǎn)換為實(shí)際類型的指針。而且malloc只管分配內(nèi)存,并不能對所得的內(nèi)存進(jìn)行初始化,所以得到的一片新內(nèi)存中,其值是隨機(jī)的。

int* p=(int)malloc(sizeof(int)100);//分配可以放下100個int的內(nèi)存空間

3.3處理數(shù)組方面

new有處理數(shù)組的new[],使用new[]分配的內(nèi)存必須使用delete[]進(jìn)行釋放。

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分配成功返回的是對象類型指針,與對象嚴(yán)格匹配,無類型轉(zhuǎn)換,所以new是符合類型安全性操作符;malloc返回值類型是void*,一般需要接強(qiáng)制類型轉(zhuǎn)換成我們需要的類型。

3.5分配失敗方面

new內(nèi)存分配失敗的時候,拋出bad_ alloc異常 ;malloc分配內(nèi)存失敗時返回NULL。

3.6自定義類型方面

new會先調(diào)用operator new函數(shù),申請足夠的內(nèi)存,然后調(diào)用類型的構(gòu)造函數(shù),初始化成員變量,最后返回自定義類型指針。delete先調(diào)用析構(gòu)函數(shù),然后調(diào)用operator delete函數(shù)釋放內(nèi)存。 malloc是庫函數(shù),只能動態(tài)地申請和釋放內(nèi)存,無法強(qiáng)制要求其做自定義類型對象構(gòu)造和析構(gòu)函數(shù)。

3.7重載方面

new可以重載,malloc不可以重載。 opeartor new /operator delete可以被重載。標(biāo)準(zhǔn)庫是定義了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的功能可以做到這一點(diǎn):

new (place_address) type

堆(heap)C語言和操作系統(tǒng)的術(shù)語,堆是操作系統(tǒng)所維護(hù)的一塊特殊內(nèi)存,它提供了動態(tài)分配的功能,當(dāng)運(yùn)行程序調(diào)用malloc()時就會從中分配,調(diào)用free()歸還內(nèi)存。 一般情況下,所有的C++編譯器默認(rèn)使用堆來實(shí)現(xiàn)自由存儲,運(yùn)算符new和delete內(nèi)部默認(rèn)是使用malloc和free的方式來被實(shí)現(xiàn)。

3.9內(nèi)存泄漏方面

內(nèi)存泄漏對于new和malloc都能檢測出來,new可以明確指出是哪個文件的哪一行,但是malloc不可以明確指出是哪個文件的哪一行。

3.10效率方面

new是關(guān)鍵字,malloc是庫函數(shù),new的效率高于malloc。 new和malloc都可用于申請動態(tài)內(nèi)存和釋放內(nèi)存。對于非內(nèi)部數(shù)據(jù)類型的對象而言,光用maloc/free無法滿足動態(tài)對象的要求。對象在創(chuàng)建的同時要自動執(zhí)行構(gòu)造函數(shù),對象在消亡之前要自動執(zhí)行析構(gòu)函數(shù)。由于malloc/free是庫函數(shù)而不是運(yùn)算符,不在編譯器控制權(quán)限之內(nèi),不能夠把執(zhí)行構(gòu)造函數(shù)和析構(gòu)函數(shù)的任務(wù)強(qiáng)加于malloc/free。 C++語言需要一個能完成動態(tài)內(nèi)存分配和初始化工作的運(yùn)算符new,以及一個能完成清理與釋放內(nèi)存工作的運(yùn)算符delete。所以說new的效率高于malloc。

4.總結(jié)

在這里插入圖片描述

到此這篇關(guān)于C語言中new與malloc的區(qū)別詳解的文章就介紹到這了,更多相關(guān)C語言new與malloc的區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

光山县| 安仁县| 晋中市| 屏东市| 泸州市| 汾阳市| 海淀区| 城固县| 揭阳市| 盘山县| 成武县| 东源县| 永丰县| 深泽县| 固阳县| 岳普湖县| 北碚区| 饶阳县| 东乌珠穆沁旗| 建昌县| 赞皇县| 满城县| 白水县| 兴宁市| 阿尔山市| 应用必备| 乐亭县| 巴南区| 台江县| 正宁县| 石楼县| 湖北省| 江西省| 沂水县| 安远县| 东乡族自治县| 开江县| 茶陵县| 珲春市| 信丰县| 毕节市|