【C++ grammar】nullptr and Dynamic Memory Allocation (空指针和动态内存分配)
空指針
1.1. 0帶來的二義性問題
1.2. C++標(biāo)準(zhǔn)化委員會(huì)希望“空指針”是一個(gè)確定的東西。
C++11中引入保留字“nullptr”作為空指針
示例:
動(dòng)態(tài)內(nèi)存管理:分配/釋放
2.1. C++中通過運(yùn)算符new申請(qǐng)動(dòng)態(tài)內(nèi)存
new <類型名> (初值) ; //申請(qǐng)一個(gè)變量的空間 new <類型名>[常量表達(dá)式] ; //申請(qǐng)數(shù)組如果申請(qǐng)成功,返回指定類型內(nèi)存的地址;
如果申請(qǐng)失敗,拋出異常,或者返回空指針(nullptr)。(C++11)
2.2. 動(dòng)態(tài)內(nèi)存使用完畢后,要用delete運(yùn)算符來釋放。
delete <指針名>; //刪除一個(gè)變量/對(duì)象 delete [] <指針名>; //刪除數(shù)組空間 int main() {int* p = nullptr; //定義整型指針變量p,并初始化為空指針nullptrint* q{ nullptr }; //定義一個(gè)空指針,通過C++11初始化列表的方式賦值p = new int(42);q = new int[4];cout << "Before change, p =" << *p << endl;*p = 24;cout << "After change, p =" << *p << endl;for (int i = 0;i < 4;i++){*(q + i) = 10 + i;cout << *(q + i) << endl;}delete p;delete [] q;return 0; }
在C++11中,還能使用0來代表空指針嗎?
答案:可以,因?yàn)樾枰蛳录嫒?#xff1a;
例如這樣:
new/delete 與 malloc/free 的區(qū)別是什么?
1、malloc與free是C++/C的標(biāo)準(zhǔn)庫(kù)函數(shù),new/delete是C++的運(yùn)算符,它們都可用于申請(qǐng)動(dòng)態(tài)內(nèi)存和釋放內(nèi)存。
2、對(duì)于非內(nèi)部數(shù)據(jù)類型的對(duì)象而言,只用malloc/free無法滿足動(dòng)態(tài)對(duì)象的要求。對(duì)象在創(chuàng)建的同時(shí),要自動(dòng)執(zhí)行構(gòu)造函數(shù),對(duì)象在消亡之前要自動(dòng)執(zhí)行析構(gòu)函數(shù)。而由于malloc/free是庫(kù)函數(shù)而不是運(yùn)算符,不在編譯器控制權(quán)限之內(nèi),不能夠把執(zhí)行構(gòu)造函數(shù)和析構(gòu)函數(shù)的任務(wù)強(qiáng)加于malloc/free
總結(jié):malloc/free是C/C++語言的標(biāo)準(zhǔn)庫(kù)函數(shù),new/delete是C++的運(yùn)算符 2.new能夠自動(dòng)分配空間大小 3.對(duì)于用戶自定義的對(duì)象而言,用maloc/free無法滿足動(dòng)態(tài)管理對(duì)象的要求。
3、malloc開辟空間的大小需自己計(jì)算,new是編譯器計(jì)算。
4、malloc返回指針是void,需要強(qiáng)制轉(zhuǎn)換為對(duì)應(yīng)類型的指針。new直接返回對(duì)應(yīng)類型指針。
5、new/delete與malloc/free申請(qǐng)內(nèi)存位置說明,malloc我們知道它是在堆上分配內(nèi)存的,但new其實(shí)不能說是在堆上,C++中,對(duì)new申請(qǐng)內(nèi)存位置有一個(gè)抽象概念,它為自由存儲(chǔ)區(qū),它可以在堆上,也可以在靜態(tài)存儲(chǔ)區(qū)上分配,這主要取決于operator
new實(shí)現(xiàn)細(xì)節(jié),取決與它在哪里為對(duì)象分配空間。
總結(jié)
以上是生活随笔為你收集整理的【C++ grammar】nullptr and Dynamic Memory Allocation (空指针和动态内存分配)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。