现代C++中判断指针为空的唯一推荐方式是ptr == nullptr,适用于所有指针类型;避免!ptr、ptr == 0或ptr == NULL;智能指针可直接if(sp),但野指针无法通过== nullptr检测。

直接用 == nullptr 判断最安全
在现代 C++(C++11 及以后)中,检查指针是否为空的唯一推荐方式是显式与 nullptr 比较。这既清晰又类型安全,避免了历史遗留问题。
-
if (ptr == nullptr)是标准写法,适用于所有指针类型(原生指针、std::unique_ptr、std::shared_ptr) - 不要用
if (!ptr)—— 虽然它通常能工作,但对某些自定义智能指针或重载了operator!的类型可能产生意外行为 - 绝对避免
if (ptr == 0)或if (ptr == NULL):NULL在 C++ 中本质是整数 0,可能触发隐式转换歧义;0更是完全绕过类型检查
std::shared_ptr 和 std::unique_ptr 的空值判断有特殊语法
智能指针支持更自然的布尔上下文判断,但需注意语义差异和陷阱。
-
if (sp)和if (sp != nullptr)等价,且推荐前者——因为std::shared_ptr明确定义了explicit operator bool() -
if (up)同样有效,但注意:移动后的std::unique_ptr会变为空,此时up.get() == nullptr为真,if (up)为假 - 不要用
if (sp.get() == nullptr)来判断智能指针——冗余且掩盖了其封装意图;除非你真正在意底层裸指针状态(比如调试内存泄漏)
野指针无法用 == nullptr 检测,这是常见误解
空指针(nullptr)和野指针(指向已释放/无效内存的指针)是两类完全不同的问题。前者可安全判断,后者不可靠检测。
-
ptr == nullptr只能告诉你指针当前是否为空,**不能说明它是否有效** - 已
delete ptr后未置空的指针,值不等于nullptr,但解引用必崩溃——此时if (ptr)会误判为“非空可用” - 养成习惯:释放后立即设为
nullptr(裸指针);或优先使用智能指针自动管理生命周期
函数参数里传入空指针时,要不要检查?
取决于接口契约。不是所有空指针都需要运行时检查,但关键路径必须防御。
立即学习“C++免费学习笔记(深入)”;
- 如果函数文档明确要求非空(如
void process(int* p)且注释写“pmust not be null”),则不必检查——由调用方负责 - 若函数要处理外部输入(如用户传入的配置指针、系统回调传参),务必在开头加
if (!p) return;或抛出std::invalid_argument - 用
[[nodiscard]]+ 断言(assert(p != nullptr))适合开发阶段快速暴露问题,但发布版会失效——生产环境需实际判断
空指针判断本身很简单,真正容易出错的是混淆“空”和“有效”,以及在智能指针和裸指针之间随意混用判断逻辑。多花两秒看一眼指针类型,比事后调试段错误省力得多。


















