欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++11?nullptr實(shí)現(xiàn)初始化空指針

 更新時間:2022年01月25日 10:12:26   投稿:zx  
避免產(chǎn)生“野指針”最有效的方法,就是在定義指針的同時完成初始化操作,本文主要介紹了C++11?nullptr初始化空指針,感興趣的可以了解一下

實(shí)際開發(fā)中,避免產(chǎn)生“野指針”最有效的方法,就是在定義指針的同時完成初始化操作,即便該指針的指向尚未明確,也要將其初始化為空指針。

所謂“野指針”,又稱“懸掛指針”,指的是沒有明確指向的指針。野指針往往指向的是那些不可用的內(nèi)存區(qū)域,這就意味著像操作普通指針那樣使用野指針(例如 &p),極可能導(dǎo)致程序發(fā)生異常。

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

int *p = 0;
int *p = NULL; //推薦使用

可以看到,我們可以將指針明確指向 0(0x0000 0000)這個內(nèi)存空間。一方面,明確指針的指向可以避免其成為野指針;另一方面,大多數(shù)操作系統(tǒng)都不允許用戶對地址為 0 的內(nèi)存空間執(zhí)行寫操作,若用戶在程序中嘗試修改其內(nèi)容,則程序運(yùn)行會直接報(bào)錯。

相比第一種方式,我們更習(xí)慣將指針初始化為 NULL。值得一提的是,NULL 并不是 C++ 的關(guān)鍵字,它是 C++ 為我們事先定義好的一個宏,并且它的值往往就是字面量 0(#define NULL 0)。

C++ 中將 NULL 定義為字面常量 0,雖然能滿足大部分場景的需要,但個別情況下,它會導(dǎo)致程序的運(yùn)行和我們的預(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;
}

程序執(zhí)行結(jié)果為:
int n
int n

對于 isnull(0) 來說,顯然它真正調(diào)用的是參數(shù)為整形的 isnull() 函數(shù);而對于 isnull(NULL),我們期望它實(shí)際調(diào)用的是參數(shù)為 void*c 的 isnull() 函數(shù),但觀察程序的執(zhí)行結(jié)果不難看出,并不符合我們的預(yù)期。

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

isnull( (void*)NULL );
isnull( (void*)0 );

如此,才會成功調(diào)用我們預(yù)期的函數(shù)(讀者可自行執(zhí)行此代碼,觀察輸出結(jié)果)。

由于 C++ 98 標(biāo)準(zhǔn)使用期間,NULL 已經(jīng)得到了廣泛的應(yīng)用,出于兼容性的考慮,C++11 標(biāo)準(zhǔn)并沒有對 NULL 的宏定義做任何修改。為了修正 C++ 存在的這一 BUG,C++ 標(biāo)準(zhǔn)委員會最終決定另其爐灶,在 C++11 標(biāo)準(zhǔn)中引入一個新關(guān)鍵字,即 nullptr。

在使用 nullptr 之前,讀者需保證自己使用的編譯器支持該關(guān)鍵字。以 Visual Studio 和 codeblocks 為例,前者早在 2010 版本就對 C++ 11 標(biāo)準(zhǔn)中的部分特性提供了支持,其中就包括 nullptr;如果使用后者,讀者需將其 G++ 編譯器版本至少升級至 4.6.1(同時開啟 -std=c++0x 編譯選項(xiàng))。

nullptr 是 nullptr_t 類型的右值常量,專用于初始化空類型指針。nullptr_t 是 C++11 新增加的數(shù)據(jù)類型,可稱為“指針空值類型”。也就是說,nullpter 僅是該類型的一個實(shí)例對象(已經(jīng)定義好,可以直接使用),如果需要我們完全定義出多個同 nullptr 完全一樣的實(shí)例對象。

值得一提的是,nullptr 可以被隱式轉(zhuǎn)換成任意的指針類型。舉個例子:

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

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

另外,通過將指針初始化為 nullptr,可以很好地解決 NULL 遺留的問題,比如:

#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;
}

程序執(zhí)行結(jié)果為:
int n
void*c

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

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

相關(guān)文章

  • C語言中system()函數(shù)的用法總結(jié)

    C語言中system()函數(shù)的用法總結(jié)

    system()函數(shù)功能強(qiáng)大。以下小編就為大家介紹一下在C語言中system()函數(shù)的用法。需要的朋友可以過來參考下,希望對大家有所幫助
    2013-10-10
  • C++中的內(nèi)存分區(qū)介紹

    C++中的內(nèi)存分區(qū)介紹

    這篇文章主要介紹了C++中的內(nèi)存分區(qū)介紹,C++的內(nèi)存劃分為棧區(qū)、堆區(qū)、全局區(qū)/靜態(tài)區(qū)、字符串常量和代碼區(qū),本文分別對他們一一說明,需要的朋友可以參考下
    2015-07-07
  • 利用C++和OpenCV庫計(jì)算圖像顏色直方圖并比較相似度

    利用C++和OpenCV庫計(jì)算圖像顏色直方圖并比較相似度

    本文介紹如何利用 C++ 和 OpenCV 庫計(jì)算圖像的顏色直方圖,并使用不同的方法比較兩張圖片的相似度,直方圖比較是圖像檢索、目標(biāo)識別等領(lǐng)域中一種簡單而有效的技術(shù),感興趣的小伙伴跟著小編一起來看看吧
    2025-06-06
  • 最新評論