C++ 中的new 和 delete 運算符及new和malloc的區(qū)別解析
一、什么是new和delete
我們知道在C語言中,動態(tài)開辟內(nèi)存的方法是使用:malloc/calloc/realloc。釋放動態(tài)開辟的內(nèi)存是free。在C++中,又引出了一個新玩法:new 和 delete。在C++中,new是用來動態(tài)開辟內(nèi)存的,delete是用來釋放我們所動態(tài)開辟的內(nèi)存。
在C語言中,對內(nèi)置類型的動態(tài)開辟我們經(jīng)常使用的函數(shù)是malloc函數(shù)。在C++中,我們也可以使用new操作符來動態(tài)申請空間。注意:我們這里發(fā)現(xiàn)了malloc 和 new 的第一個區(qū)別,malloc是函數(shù),new是一個操作符。當然,成對出現(xiàn)的free 是函數(shù),delete 是操作符。我們先看其實用方法的對比,代碼如下:
void Test() { // 動態(tài)申請一個int類型的空間 int* p1 = malloc(sizeof(int)); int* p2 = new int; // 動態(tài)申請一個int類型的空間并初始化為10 int* p3 = malloc(sizeof(int)); *p3 = 10; int* p4 = new int(10); // 動態(tài)申請10個int類型的空間 int* p5 = malloc(sizeof(int) * 3); int* p6 = new int[3]; //釋放 free(p1); delete p2; free(p3); delete p4; free(p5); delete[] p6; }
通過上面的使用對比,我們可以很明顯的感覺到new和delete使用起來更加方便。因為我們在使用new動態(tài)開辟空間時,并不需要計算所開辟空間類型的大小。因為后面跟著類型,new會自動計算出類型的大小。
我們還發(fā)現(xiàn),new在動態(tài)開辟內(nèi)存時,還可以對其進行初始化。而malloc開辟后,才可通過解引用對其進行初始化。new在動態(tài)開辟數(shù)組時,也可對其進行初始化,但是這只是C++11才開始支持的語法,用法如下:
int* p6 = new int[10]{1,2,3}; delete[] p6; //后面沒有給出的值,會自動初始化為0。
二、new和malloc的區(qū)別
new 和 malloc 的區(qū)別 :
1.malloc 是c語言庫函數(shù),new是運算符。
2.malloc 返回值必須強制類型轉(zhuǎn)換,new的返回值不需要。
3.malloc 必須傳入具體字節(jié)個數(shù),new傳入變量個數(shù)或者變量本身。
4.malloc 申請失敗會返回空,new會拋出異常。
5.使用new創(chuàng)建一個類的對象時會先調(diào)用malloc分配空間,然后再調(diào)用構(gòu)造函數(shù)給成員變量賦值。
6.在給自定義類申請空間時new和delete會自動調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)。
到此這篇關于C++ 中的new 和 delete 運算符及new和malloc的區(qū)別解析的文章就介紹到這了,更多相關c++ new 和 delete 運算符內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
string,CString,char*之間的轉(zhuǎn)化
下面是MFC/C++/C中字符類型CString, int, string, char*之間的轉(zhuǎn)換的說明與舉例,經(jīng)常用的東西,相信對于用C/C++的朋友,還是比較有用的2013-03-03詳解c++中signal信號攜帶數(shù)據(jù)的接收與發(fā)送
這篇文章主要為大家詳細介紹了c++中signal信號攜帶數(shù)據(jù)的接收與發(fā)送的相關知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2024-01-01