最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ 11 nullptr 空指針示例詳解

 更新時(shí)間:2024年10月09日 10:43:49   作者:MR_Promethus  
C++11標(biāo)準(zhǔn)引入了nullptr來替代傳統(tǒng)的NULL,解決了NULL可能導(dǎo)致的類型混淆問題,nullptr是nullptr_t類型的實(shí)例,專用于初始化空類型指針,與整型不會發(fā)生隱式轉(zhuǎn)換,從而使代碼更健壯,它可以被隱式轉(zhuǎn)換為任意類型的指針,提高了代碼的安全性和可讀性

C++11 中,nullptr 是空指針,可用來給 (指向任意對象類型的) 指針賦值。

【 0. 問題背景 】

0.1 野指針和懸空指針

總結(jié)

野指針懸空指針
產(chǎn)生原因指針變量未被初始化 就開始使用。對象被刪除或內(nèi)存塊被釋放后,指向該內(nèi)存的指針沒有被及時(shí)設(shè)為nullptr,指針指向一塊無效內(nèi)存。
危害使用野指針可能會導(dǎo)致 程序崩潰,因?yàn)樗赡軙S機(jī)訪問未知內(nèi)存。如果繼續(xù)使用它,可能會操作一些已被操作系統(tǒng)回收或重新分配給其他程序的內(nèi)存,從而導(dǎo)致 數(shù)據(jù)損壞或程序異常
避免方法定義指針的同時(shí)完成初始化操作 ,即便該指針的指向尚未明確,也要將其初始化為空指針。應(yīng)該在釋放內(nèi)存或?qū)ο箐N毀后將指針設(shè)置為空指針 。

野指針和懸空指針的示例

#include <iostream>
using namespace std;
int main() {
    // 野指針示例
    int* wildPtr;  // 未初始化的指針
    // 未定義行為:嘗試使用未初始化的指針
    //cout << *wildPtr << endl;  // 可能導(dǎo)致崩潰
    // 懸空指針示例
    int* danglingPtr = new int(10);  // 分配內(nèi)存
    delete danglingPtr;              // 釋放內(nèi)存
    // 未定義行為:嘗試訪問已釋放的內(nèi)存
    //cout << *danglingPtr <<endl;  // 可能導(dǎo)致崩潰
    return 0;
}

0.2 傳統(tǒng)空指針 NULL

傳統(tǒng)空指針 的基本語法

C++98/03 標(biāo)準(zhǔn)中,將一個(gè)指針初始化為空指針的方式有 2 種:

  • 第一種,可以將指針明確指向 0(0x0000 0000)這個(gè)內(nèi)存空間。大多數(shù)操作系統(tǒng)都不允許用戶對地址為 0 的內(nèi)存空間執(zhí)行寫操作,若用戶在程序中嘗試修改其內(nèi)容,則程序運(yùn)行會直接報(bào)錯(cuò)。
  • 第二種,可以將指針初始化為 NULL。NULL 并不是 C++ 的關(guān)鍵字,它是 C++ 為我們事先定義好的一個(gè)宏,并且它的值往往就是字面量 0(#define NULL 0)。
int *p = 0;
int *p = NULL; //推薦使用

0.3 傳統(tǒng)空指針的局限性

C++ 中將 NULL 定義為字面常量 0,雖然能滿足大部分場景的需要,但個(gè)別情況下,它會導(dǎo)致程序的運(yùn)行和我們的預(yù)期不符,如下代碼所示:

  • 對于 isnull(0) 來說,顯然它真正調(diào)用的是參數(shù)為整形的 isnull() 函數(shù);而對于 isnull(NULL),我們期望它實(shí)際調(diào)用的是參數(shù)為 void*c 的 isnull() 函數(shù),但觀察程序的執(zhí)行結(jié)果不難看出,并不符合我們的預(yù)期。
#include <iostream>
using namespace std;
void isnull(void* c) {
    cout << "void*c" << endl;
}
void isnull(int n) {
    cout << "int n" << endl;
}
int main(){
    isnull(0);
    isnull(NULL);
    return 0;
}

C++ 98/03 標(biāo)準(zhǔn)中,如果我們想令 isnull(NULL) 實(shí)際調(diào)用的是 isnull(void* c),就需要對 NULL(或者 0)進(jìn)行強(qiáng)制類型轉(zhuǎn)換:如此,才會成功調(diào)用我們預(yù)期的函數(shù)。

isnull( (void*)NULL );
// 或者
isnull( (void*)0 );

【 1. 基本用法 】

  • 由于 C++ 98 標(biāo)準(zhǔn)使用期間,NULL 已經(jīng)得到了廣泛的應(yīng)用,出于兼容性的考慮,C++11 標(biāo)準(zhǔn)并沒有對 NULL 的宏定義做任何修改,即 傳統(tǒng)空指針NULL仍可用但是有BUG 。為了修正 C++ 存在的這一 BUG,C++ 標(biāo)準(zhǔn)委員會最終決定另其爐灶,在 C++11 標(biāo)準(zhǔn)中引入一個(gè)新關(guān)鍵字,即 nullptr。
  • nullptr_t 指針空值類型 是 C++11 新增加的數(shù)據(jù)類型。nullptr 是 nullptr_t 類型的右值常量,專用于初始化空類型指針,也就是說,nullptr 僅是該類型的一個(gè)已定義好可直接使用的實(shí)例對象 ,如果需要我們完全定義出多個(gè)同 nullptr 完全一樣的實(shí)例對象。

【 2. nullptr 的應(yīng)用 】

2.1 nullptr 解決 NULL 的遺留BUG

由于 nullptr 無法隱式轉(zhuǎn)換為整形,而可以隱式匹配指針類型 ,因此執(zhí)行結(jié)果和我們的預(yù)期相符。
總之在 C++11 標(biāo)準(zhǔn)下,相比 NULL 和 0,使用 nullptr 初始化空指針可以令我們編寫的程序更加健壯。

#include <iostream>
using namespace std;
void isnull(void *c){
    cout << "void*c" << endl;
}
void isnull(int n){
    cout << "int n" << endl;
}
int main() {
    isnull(NULL);
    isnull(nullptr);
    return 0;
}

2.2 簡單實(shí)例

不同類型的指針變量都可以使用 nullptr 來初始化,編譯器分別將 nullptr 隱式轉(zhuǎn)換成 int*、char* 以及 double* 指針類型。

int * a1 = nullptr;
char * a2 = nullptr;
double * a3 = nullptr;

到此這篇關(guān)于C++ 11 nullptr 空指針的文章就介紹到這了,更多相關(guān)C++ 11 nullptr 空指針內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++實(shí)現(xiàn)LeetCode(90.子集合之二)

    C++實(shí)現(xiàn)LeetCode(90.子集合之二)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(90.子集合之二),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • c語言求1+2+...+n的解決方法

    c語言求1+2+...+n的解決方法

    本篇文章是對在c語言中求1+2+...+n的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++標(biāo)準(zhǔn)庫中的Stack(堆棧)和Queue(隊(duì)列)詳解

    C++標(biāo)準(zhǔn)庫中的Stack(堆棧)和Queue(隊(duì)列)詳解

    在C++標(biāo)準(zhǔn)模板庫(STL)中,stack和queue是兩種非常重要的容器適配器,這篇文章主要介紹了C++標(biāo)準(zhǔn)庫中Stack(堆棧)和Queue(隊(duì)列)的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-10-10
  • C語言學(xué)習(xí)筆記之VS2022安裝使用教程

    C語言學(xué)習(xí)筆記之VS2022安裝使用教程

    這篇文章主要介紹了C語言學(xué)習(xí)筆記之VS2022安裝使用教程,在VS2022中,在使用scanf函數(shù)編譯出錯(cuò),本文給大家提到了解決方法,需要的朋友可以參考下
    2022-05-05
  • C++實(shí)現(xiàn)LeetCode(71.簡化路徑)

    C++實(shí)現(xiàn)LeetCode(71.簡化路徑)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(71.簡化路徑),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 深入C++浮點(diǎn)數(shù)無效值定義與判定的解決辦法

    深入C++浮點(diǎn)數(shù)無效值定義與判定的解決辦法

    本篇文章是對C++中浮點(diǎn)數(shù)無效值定義與判定進(jìn)行了介紹,需要的朋友參考下
    2013-05-05
  • C++函數(shù)返回值缺失問題及解決

    C++函數(shù)返回值缺失問題及解決

    C++函數(shù)返回值缺失會導(dǎo)致未定義行為,引發(fā)邏輯錯(cuò)誤、崩潰等風(fēng)險(xiǎn),編譯器通常僅警告而非強(qiáng)制報(bào)錯(cuò),但可通過編譯選項(xiàng)將其升級為錯(cuò)誤,解決方案包括顯式覆蓋所有代碼路徑、啟用嚴(yán)格檢查、簡化控制流,并注意main函數(shù)的隱式返回0例外
    2025-09-09
  • C語言編程入門必背的示例代碼整理大全

    C語言編程入門必背的示例代碼整理大全

    這篇文章主要為大家整理并介紹了C語言編程必背的示例代碼大全,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-11-11
  • C++?set的使用示例詳解

    C++?set的使用示例詳解

    序列式容器如vector、list等存儲數(shù)據(jù)的邏輯結(jié)構(gòu)為線性序列,元素的存儲和訪問是按位置順序進(jìn)行的,而關(guān)聯(lián)式容器如set、map等,本文給大家介紹C++?set的使用示例詳解,感興趣的朋友一起看看吧
    2024-10-10
  • 使用udp發(fā)送>=128K的消息會報(bào)ENOBUFS的錯(cuò)誤的解決方法

    使用udp發(fā)送>=128K的消息會報(bào)ENOBUFS的錯(cuò)誤的解決方法

    在項(xiàng)目中選擇了unix域的數(shù)據(jù)報(bào)套接口。在使用過程中碰到了如下,問題:發(fā)送<128K的消息時(shí),客戶、進(jìn)程可以正常收發(fā)消息;發(fā)送>=128K的消息時(shí),發(fā)送端(sendto)返回ENOBUFS的錯(cuò)誤。下面小編來詳細(xì)說下
    2019-05-05

最新評論

大埔县| 繁昌县| 双峰县| 通州市| 凤台县| 饶阳县| 治多县| 高清| 横山县| 灯塔市| 日土县| 嘉鱼县| 崇礼县| 广南县| 平遥县| 玉溪市| 开原市| 丹巴县| 上饶市| 八宿县| 阿荣旗| 陆川县| 汝阳县| 华亭县| 新泰市| 东乌珠穆沁旗| 长阳| 水富县| 台南市| 道孚县| 临泽县| 定州市| 松阳县| 永顺县| 合江县| 宜兰市| 东乡| 包头市| 松原市| 宁乡县| 安乡县|