系列文章目錄
C++11新特性使用詳解-持續更新
https://blog.csdn.net/xiaofeizai1116/category_12498334.html
文章目錄
- 系列文章目錄
- 一、簡介
- 二、引入nullptr原因
- 1. 消除歧義
- 2. 兼容性問題
- 3. 類型安全
- 三、使用場景
- 1. 初始化指針變量
- 2. 判斷指針是否為空
- 3. 釋放內存后置為空
- 四、總結
一、簡介
C++11引入了nullptr關鍵字,它是一種空指針類型,用于表示空指針。
二、引入nullptr原因
C++11之前空指針一般用`NULL宏或者0值表示,為什么還有引入nullptr呢?
1. 消除歧義
NULL宏在不同的編譯器環境中可能代表不同的值,容易造成對空指針的理解混亂;另外把0賦給指針,也容易給人造成把整數常量賦給指針的誤解。使用nullptr從語言層面解決了上述問題,提高了代碼的可讀性。
Note
NULL本質上是0,在內存中表示不存在或沒有指向任何對象的指針。如果一個指針被初始化為NULL,意味著它目前不指向任何對象或數據。
2. 兼容性問題
不同平臺對NULL的定義不同,可能導致移植問題。相比之下,因為nullptr是語言層面的關鍵字,不會存在平臺依賴性問題,從而提高代碼的可移植性。
3. 類型安全
nullptr是一個類型安全的空指針,它明確地表示一個空指針,不能轉換成任何除void*以外的其他類型。避免了使用NULL時可能出現的類型轉換問題。
Note
NULL是一個宏,不是關鍵字,所以它不會被編譯器檢查類型。如果將其用于需要指針類型的地方,編譯器會將其視為0,而不是一個指針類型。
/*
下面這段代碼會運行時會崩潰,原因如下
NULL是一個宏,通常被定義為0或((void*)0),表示一個空指針。當我們將一個指針變量賦值為NULL時,它表示這個指針變量不指向任何有效的內存地址。
在解引用一個指針時,我們需要將指針所指向的內存地址中的值讀取出來。在代碼int x = *p1中,表示讀取p1所指向的內存地址中的值。由于p1是一個int類型的指針,編譯器期望p1指向一個整數類型的內存地址。但是,由于NULL是一個void*類型的值,它不是一個整數類型的值,當試圖將一個void類型的值賦給一個int類型的變量時,因為類型不匹配,編譯器會報錯。
*/
int* p1 = NULL;
int x = *p1;
/*
相比之下,使用nullptr可以避免類型不匹配的問題。
nullptr是一個類型安全的空指針,它明確地表示一個空指針。
編譯器會檢查使用nullptr的上下文,確保它被正確地用于指針類型。在這段代碼中,p2被初始化為nullptr,表示它是一個空指針。
由于p2被聲明為int*類型,編譯器期望p2指向一個整數。然而,由于p2是空的,不能解引用它來獲取一個整數值。編譯器會報錯,避免了類型轉換問題。
*/
int* p2 = nullptr;
int x = *p2; // 編譯器會報錯,因為p是一個空指針
三、使用場景
1. 初始化指針變量
用nullptr聲明一個空指針變量
int* p = nullptr; // 初始化一個整型指針變量p,值為空指針
在需要指針類型的地方,編譯器會根據上下文自動將nullptr轉換為正確的指針類型
/*
在這個例子中,我們調用func函數時傳遞了一個空指針作為參數。編譯器會自動將nullptr轉換為整數類型的指針,并傳遞給func函數。
func函數在接收到空指針后,就可以避免對無效的內存地址進行操作,從而避免了潛在的錯誤。
*/
void func(int* p) { // ...
} int main() { func(nullptr); // 使用nullptr表示不傳遞任何有效的指針 return 0;
}
2. 判斷指針是否為空
int* p = getPointFunc();
if (p != nullptr) { // 如果p不為空指針,則執行這里的代碼
}
3. 釋放內存后置為空
int* p = new int; // 動態分配內存
// 使用p指向的內存
delete p; // 釋放內存
p = nullptr; // 明確地將p設置為空指針
四、總結
總的來說,nullptr是以一種更安全、更清晰的方式來處理空指針。只要正確理解和合理使用,它就能夠幫助我們編寫出質量更高、更容易維護的代碼。