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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

【C++ grammar】nullptr and Dynamic Memory Allocation (空指针和动态内存分配)

發(fā)布時間:2023/12/1 c/c++ 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【C++ grammar】nullptr and Dynamic Memory Allocation (空指针和动态内存分配) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

空指針

1.1. 0帶來的二義性問題

  • C++03中,空指針使用“0”來表示。0既是一個常量整數(shù),也是一個常量空指針。
  • C語言中,空指針使用(void *)0來表示
  • 有時候,用“NULL”來表示空指針(一種可能的實現(xiàn)方式是#define NULL 0)
  • 1.2. C++標準化委員會希望“空指針”是一個確定的東西。
    C++11中引入保留字“nullptr”作為空指針
    示例:

    void codeExample() {auto x{ 10 }; //auto是類型推斷機制,通過x初始化的值來推斷x類型//相當于 int x=10;int* p = nullptr; //定義整型指針變量p,并初始化為空指針nullptrint* q{ nullptr }; //定義一個空指針,通過C++11初始化列表的方式賦值q = &x; //將x的地址賦值給q }

    動態(tài)內(nèi)存管理:分配/釋放

    2.1. C++中通過運算符new申請動態(tài)內(nèi)存

    new <類型名> (初值) ; //申請一個變量的空間 new <類型名>[常量表達式] ; //申請數(shù)組

    如果申請成功,返回指定類型內(nèi)存的地址;
    如果申請失敗,拋出異常,或者返回空指針(nullptr)。(C++11)

    2.2. 動態(tài)內(nèi)存使用完畢后,要用delete運算符來釋放。

    delete <指針名>; //刪除一個變量/對象 delete [] <指針名>; //刪除數(shù)組空間

    int main() {int* p = nullptr; //定義整型指針變量p,并初始化為空指針nullptrint* q{ nullptr }; //定義一個空指針,通過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來代表空指針嗎?
    答案:可以,因為需要向下兼容:
    例如這樣:

    int* p = 0; int* q{ 0 };

    new/delete 與 malloc/free 的區(qū)別是什么?

    1、malloc與free是C++/C的標準庫函數(shù),new/delete是C++的運算符,它們都可用于申請動態(tài)內(nèi)存和釋放內(nèi)存。

    2、對于非內(nèi)部數(shù)據(jù)類型的對象而言,只用malloc/free無法滿足動態(tài)對象的要求。對象在創(chuàng)建的同時,要自動執(zhí)行構(gòu)造函數(shù),對象在消亡之前要自動執(zhí)行析構(gòu)函數(shù)。而由于malloc/free是庫函數(shù)而不是運算符,不在編譯器控制權(quán)限之內(nèi),不能夠把執(zhí)行構(gòu)造函數(shù)和析構(gòu)函數(shù)的任務強加于malloc/free
    總結(jié):malloc/free是C/C++語言的標準庫函數(shù),new/delete是C++的運算符 2.new能夠自動分配空間大小 3.對于用戶自定義的對象而言,用maloc/free無法滿足動態(tài)管理對象的要求。
    3、malloc開辟空間的大小需自己計算,new是編譯器計算。

    4、malloc返回指針是void,需要強制轉(zhuǎn)換為對應類型的指針。new直接返回對應類型指針。

    5、new/delete與malloc/free申請內(nèi)存位置說明,malloc我們知道它是在堆上分配內(nèi)存的,但new其實不能說是在堆上,C++中,對new申請內(nèi)存位置有一個抽象概念,它為自由存儲區(qū),它可以在堆上,也可以在靜態(tài)存儲區(qū)上分配,這主要取決于operator
    new實現(xiàn)細節(jié),取決與它在哪里為對象分配空間。

    總結(jié)

    以上是生活随笔為你收集整理的【C++ grammar】nullptr and Dynamic Memory Allocation (空指针和动态内存分配)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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