nullptr
指针空值类型 nullptr
在 C++ 程序开发中,为了提高程序的健壮性,一般会在定义指针的同时完成初始化操作,或者在指针的指向尚未明确的情况下,
都会给指针初始化为 NULL,避免产生野指针(没有明确指向的指针,操作这种指针可能导致程序发生异常)。C++98/03 标准中,将一个指针初始化为空指针的方式有两种:
1 | |
底层源码中 NULL 这个宏的定义:
1 | |
如果源码是 C++ 程序 NULL 就是 0;如果是 C 程序 NULL 表示 (void*)0。为什么要这样做?
C++ 中 void* 类型无法隐式转换为其他类型的指针,此时使用 0 代替 ((void *)0),用于解决空指针的问题。
这个 0(0x0000 0000) 表示的就是虚拟地址空间中的 0 地址,这块地址是只读的。
C++ 中将 NULL 定义为字面常量 0,并不能保证在所有场景下都能很好的工作。
比如,函数重载时,NULL 和 0 无法区分:
1 | |
出于兼容性的考虑,C++11 标准并没有对 NULL 的宏定义做任何修改,而是引入了一个新的关键字 nullptr。
C++ 中指针必须有明确的类型定义,nullptr 专用于初始化空类型指针,不同类型的指针变量都可以使用 nullptr 来初始化:
1 | |
编译器分别将 nullptr 隐式转换成 int*、char* 以及 double* 指针类型。
使用 nullptr 可以解决上边提到的函数重载问题:
1 | |
总结:nullptr 无法隐式转换为整形,但是可以隐式匹配指针类型。
在 C++11 标准下,相比 NULL 和 0,使用 nullptr 初始化空指针可以令编写的程序更加健壮。
扩展:C++ nullptr 的实现