日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ new和malloc的区别

發(fā)布時(shí)間:2023/12/13 c/c++ 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ new和malloc的区别 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

這里先對new和delete簡單進(jìn)行一下總結(jié),然后再細(xì)說new和malloc的區(qū)別。

一、new和delete
C語言提供了malloc和free兩個(gè)系統(tǒng)函數(shù),完成對堆內(nèi)存的申請和釋放。而C++則提供了兩個(gè)關(guān)鍵字new和delete;

1.1 規(guī)則

  • new/delete是關(guān)鍵字,效率高于malloc和free。
  • 配對使用,避免內(nèi)存泄漏和多重釋放。
  • 避免交叉使用,比如malloc申請空間delete釋放,new出的空間被free。
  • new/delete 主要是用在類對象的申請和釋放。申請的時(shí)候會(huì)調(diào)用構(gòu)造器完成初始化,釋放的時(shí)候,會(huì)調(diào)用析構(gòu)器完成內(nèi)存清理。

1.2 new/new[] 用法

//開辟單地址空間int *p = new int; //開辟大小為sizeof(int)空間int *q = new int(5); //開辟大小為sizeof(int)的空間,并初始化為5。//開辟數(shù)組空間//一維int *a = new int[100]{0};//開辟大小為100的整型數(shù)組空間,并初始化為0。//二維int (*a)[6] = new int[5][6];//三維int (*a)[5][6] = new int[3][5][6];//四維及以上以此類推。

1.3 delete/delete[] 用法

//釋放單個(gè)int空間int *a = new int;delete a;//釋放int數(shù)組空間int *b = new int[5];delete []b;

二、new和malloc的區(qū)別

2.1 屬性
new和delete是C++關(guān)鍵字,需要編譯器支持;malloc和free是庫函數(shù),需要頭文件支持。

2.2 參數(shù)
使用new操作符申請內(nèi)存分配時(shí)無須指定內(nèi)存塊的大小,編譯器會(huì)根據(jù)類型信息自行計(jì)算。而malloc則需要顯式地指出所需內(nèi)存的尺寸。

2.3 返回類型
new操作符內(nèi)存分配成功時(shí),返回的是對象類型的指針,類型嚴(yán)格與對象匹配,無須進(jìn)行類型轉(zhuǎn)換,故new是符合類型安全性的操作符。而malloc內(nèi)存分配成功則是返回void * ,需要通過強(qiáng)制類型轉(zhuǎn)換將void*指針轉(zhuǎn)換成我們需要的類型。

2.4 自定義類型
new會(huì)先調(diào)用operator new函數(shù),申請足夠的內(nèi)存(通常底層使用malloc實(shí)現(xiàn))。然后調(diào)用類型的構(gòu)造函數(shù),初始化成員變量,最后返回自定義類型指針。delete先調(diào)用析構(gòu)函數(shù),然后調(diào)用operator delete函數(shù)釋放內(nèi)存(通常底層使用free實(shí)現(xiàn))。

malloc/free是庫函數(shù),只能動(dòng)態(tài)的申請和釋放內(nèi)存,無法強(qiáng)制要求其做自定義類型對象構(gòu)造和析構(gòu)工作。

2.5 “重載”
C++允許自定義operator new 和 operator delete 函數(shù)控制動(dòng)態(tài)內(nèi)存的分配。

2.6 內(nèi)存區(qū)域
new做兩件事:分配內(nèi)存和調(diào)用類的構(gòu)造函數(shù),delete是:調(diào)用類的析構(gòu)函數(shù)和釋放內(nèi)存。而malloc和free只是分配和釋放內(nèi)存。

new操作符從自由存儲(chǔ)區(qū)(free store)上為對象動(dòng)態(tài)分配內(nèi)存空間,而malloc函數(shù)從堆上動(dòng)態(tài)分配內(nèi)存。自由存儲(chǔ)區(qū)是C++基于new操作符的一個(gè)抽象概念,凡是通過new操作符進(jìn)行內(nèi)存申請,該內(nèi)存即為自由存儲(chǔ)區(qū)。而堆是操作系統(tǒng)中的術(shù)語,是操作系統(tǒng)所維護(hù)的一塊特殊內(nèi)存,用于程序的內(nèi)存動(dòng)態(tài)分配,C語言使用malloc從堆上分配內(nèi)存,使用free釋放已分配的對應(yīng)內(nèi)存。自由存儲(chǔ)區(qū)不等于堆,如上所述,布局new就可以不位于堆中。

2.7 分配失敗
new內(nèi)存分配失敗時(shí),會(huì)拋出bac_alloc異常。malloc分配內(nèi)存失敗時(shí)返回NULL。

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

總結(jié)

以上是生活随笔為你收集整理的C++ new和malloc的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。