C++ 中的new 和 delete 運(yùn)算符及new和malloc的區(qū)別解析
一、什么是new和delete
我們知道在C語(yǔ)言中,動(dòng)態(tài)開辟內(nèi)存的方法是使用:malloc/calloc/realloc。釋放動(dòng)態(tài)開辟的內(nèi)存是free。在C++中,又引出了一個(gè)新玩法:new 和 delete。在C++中,new是用來(lái)動(dòng)態(tài)開辟內(nèi)存的,delete是用來(lái)釋放我們所動(dòng)態(tài)開辟的內(nèi)存。
在C語(yǔ)言中,對(duì)內(nèi)置類型的動(dòng)態(tài)開辟我們經(jīng)常使用的函數(shù)是malloc函數(shù)。在C++中,我們也可以使用new操作符來(lái)動(dòng)態(tài)申請(qǐng)空間。注意:我們這里發(fā)現(xiàn)了malloc 和 new 的第一個(gè)區(qū)別,malloc是函數(shù),new是一個(gè)操作符。當(dāng)然,成對(duì)出現(xiàn)的free 是函數(shù),delete 是操作符。我們先看其實(shí)用方法的對(duì)比,代碼如下:
void Test() { // 動(dòng)態(tài)申請(qǐng)一個(gè)int類型的空間 int* p1 = malloc(sizeof(int)); int* p2 = new int; // 動(dòng)態(tài)申請(qǐng)一個(gè)int類型的空間并初始化為10 int* p3 = malloc(sizeof(int)); *p3 = 10; int* p4 = new int(10); // 動(dòng)態(tài)申請(qǐng)10個(gè)int類型的空間 int* p5 = malloc(sizeof(int) * 3); int* p6 = new int[3]; //釋放 free(p1); delete p2; free(p3); delete p4; free(p5); delete[] p6; }
通過上面的使用對(duì)比,我們可以很明顯的感覺到new和delete使用起來(lái)更加方便。因?yàn)槲覀冊(cè)谑褂胣ew動(dòng)態(tài)開辟空間時(shí),并不需要計(jì)算所開辟空間類型的大小。因?yàn)楹竺娓愋?,new會(huì)自動(dòng)計(jì)算出類型的大小。
我們還發(fā)現(xiàn),new在動(dòng)態(tài)開辟內(nèi)存時(shí),還可以對(duì)其進(jìn)行初始化。而malloc開辟后,才可通過解引用對(duì)其進(jìn)行初始化。new在動(dòng)態(tài)開辟數(shù)組時(shí),也可對(duì)其進(jìn)行初始化,但是這只是C++11才開始支持的語(yǔ)法,用法如下:
int* p6 = new int[10]{1,2,3}; delete[] p6; //后面沒有給出的值,會(huì)自動(dòng)初始化為0。
二、new和malloc的區(qū)別
new 和 malloc 的區(qū)別 :
1.malloc 是c語(yǔ)言庫(kù)函數(shù),new是運(yùn)算符。
2.malloc 返回值必須強(qiáng)制類型轉(zhuǎn)換,new的返回值不需要。
3.malloc 必須傳入具體字節(jié)個(gè)數(shù),new傳入變量個(gè)數(shù)或者變量本身。
4.malloc 申請(qǐng)失敗會(huì)返回空,new會(huì)拋出異常。
5.使用new創(chuàng)建一個(gè)類的對(duì)象時(shí)會(huì)先調(diào)用malloc分配空間,然后再調(diào)用構(gòu)造函數(shù)給成員變量賦值。
6.在給自定義類申請(qǐng)空間時(shí)new和delete會(huì)自動(dòng)調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)。
到此這篇關(guān)于C++ 中的new 和 delete 運(yùn)算符及new和malloc的區(qū)別解析的文章就介紹到這了,更多相關(guān)c++ new 和 delete 運(yùn)算符內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++?TCP網(wǎng)絡(luò)編程詳細(xì)講解
TCP/IP是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議,它會(huì)保證數(shù)據(jù)不丟包、不亂序。TCP全名是Transmission?Control?Protocol,它是位于網(wǎng)絡(luò)OSI模型中的第四層2022-09-09string,CString,char*之間的轉(zhuǎn)化
下面是MFC/C++/C中字符類型CString, int, string, char*之間的轉(zhuǎn)換的說明與舉例,經(jīng)常用的東西,相信對(duì)于用C/C++的朋友,還是比較有用的2013-03-03C++通過SQLiteSDK增刪改查的實(shí)現(xiàn)示例
SQLite是一種輕量級(jí)的嵌入式數(shù)據(jù)庫(kù),可以利用SQLiteSDK執(zhí)行數(shù)據(jù)庫(kù)的增刪改查操作,本文主要介紹了C++通過SQLiteSDK增刪改查,具有一定的參考價(jià)值,感興趣的可以了解一下2025-03-03詳解c++中signal信號(hào)攜帶數(shù)據(jù)的接收與發(fā)送
這篇文章主要為大家詳細(xì)介紹了c++中signal信號(hào)攜帶數(shù)據(jù)的接收與發(fā)送的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01