c++11起推荐用 ptr == nullptr 判断空指针,因其明确、类型安全、无宏依赖且可优化;null 和 ptr == 0 易引发重载歧义或语义模糊;智能指针优先用 !ptr;野指针无法通过空检防范。

用 == nullptr 判断空指针最安全
直接比较 ptr == nullptr 是 C++11 及以后唯一推荐的空指针检查方式。它明确、类型安全、不依赖宏,且能被编译器充分优化。
-
NULL是宏(常定义为0或0L),在函数重载场景可能引发意外匹配,比如func(int)和func(char*)之间歧义 -
ptr == 0虽然合法,但语义模糊——是整数零还是空指针?可读性和维护性差 -
if (ptr)看似简洁,但前提是ptr是原生指针;若为自定义智能指针或代理类,可能隐式转换出错,或触发非预期的operator bool()
智能指针别用 == nullptr,改用 !ptr 或 ptr != nullptr
std::shared_ptr 和 std::unique_ptr 支持布尔上下文转换,但直接写 ptr == nullptr 并非错误,只是冗余;更自然、更符合习惯的是 !ptr。
-
!ptr更简洁,且对所有标准智能指针都有效,包括std::weak_ptr(需配合lock()) - 注意:
std::weak_ptr本身不能直接判空,wptr.expired()表示所指对象已销毁,!wptr.lock()才等价于“无法获取有效共享指针” - 不要对
std::unique_ptr做ptr.get() == nullptr——绕过接口多此一举,!ptr就够了
野指针比空指针更危险,== nullptr 完全无效
空指针可预测、可拦截;野指针指向已释放/未初始化内存,ptr == nullptr 返回 false,但解引用必崩。这类问题无法靠空值检查预防。
- 常见来源:释放后未置
nullptr(尤其裸指针)、返回局部变量地址、std::move后继续使用原unique_ptr - 调试阶段可用 AddressSanitizer(
-fsanitize=address)捕获大部分野指针访问 - 生产环境避免裸指针管理资源,优先用
std::unique_ptr或std::shared_ptr,让生命周期自动约束
结构体成员指针或数组索引前,必须先确认指针非空
看似简单的 obj->field 或 arr[i],一旦 obj 或 arr 是空指针,就是未定义行为。编译器不会帮你加空检,得自己来。
立即学习“C++免费学习笔记(深入)”;
- 不要写
if (ptr) return ptr->data;然后在else分支漏掉返回值——这会导致静默未定义行为 - 函数参数为指针时,若逻辑上不允许为空,考虑用引用代替(
T&),或用gsl::not_null<t></t>(需引入 GSL)做编译期提示 - 容器迭代器不是指针,但类似:解引用
end()迭代器和解引用空指针一样危险,且it == container.end()不等于it == nullptr
== nullptr,而是把本该强制非空的地方当成可选路径来写。








