C++怎么判断空指针 C++安全检查指针合法性【重点】

1次阅读

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

C++怎么判断空指针 C++安全检查指针合法性【重点】

== nullptr 判断空指针最安全

直接比较 ptr == nullptr 是 C++11 及以后唯一推荐的空指针检查方式。它明确、类型安全、不依赖宏,且能被编译器充分优化。

  • NULL 是宏(常定义为 00L),在函数重载场景可能引发意外匹配,比如 func(int)func(char*) 之间歧义
  • ptr == 0 虽然合法,但语义模糊——是整数零还是空指针?可读性和维护性差
  • if (ptr) 看似简洁,但前提是 ptr 是原生指针;若为自定义智能指针或代理类,可能隐式转换出错,或触发非预期的 operator bool()

智能指针别用 == nullptr,改用 !ptrptr != nullptr

std::shared_ptrstd::unique_ptr 支持布尔上下文转换,但直接写 ptr == nullptr 并非错误,只是冗余;更自然、更符合习惯的是 !ptr

  • !ptr 更简洁,且对所有标准智能指针都有效,包括 std::weak_ptr(需配合 lock()
  • 注意:std::weak_ptr 本身不能直接判空,wptr.expired() 表示所指对象已销毁,!wptr.lock() 才等价于“无法获取有效共享指针”
  • 不要对 std::unique_ptrptr.get() == nullptr ——绕过接口多此一举,!ptr 就够了

野指针比空指针更危险,== nullptr 完全无效

空指针可预测、可拦截;野指针指向已释放/未初始化内存,ptr == nullptr 返回 false,但解引用必崩。这类问题无法靠空值检查预防。

  • 常见来源:释放后未置 nullptr(尤其裸指针)、返回局部变量地址、std::move 后继续使用原 unique_ptr
  • 调试阶段可用 AddressSanitizer(-fsanitize=address)捕获大部分野指针访问
  • 生产环境避免裸指针管理资源,优先用 std::unique_ptrstd::shared_ptr,让生命周期自动约束

结构体成员指针或数组索引前,必须先确认指针非空

看似简单的 obj->fieldarr[i],一旦 objarr 是空指针,就是未定义行为。编译器不会帮你加空检,得自己来。

立即学习C++免费学习笔记(深入)”;

  • 不要写 if (ptr) return ptr->data; 然后在 else 分支漏掉返回值——这会导致静默未定义行为
  • 函数参数为指针时,若逻辑上不允许为空,考虑用引用代替(T&),或用 gsl::not_null<t></t>(需引入 GSL)做编译期提示
  • 容器迭代器不是指针,但类似:解引用 end() 迭代器和解引用空指针一样危险,且 it == container.end() 不等于 it == nullptr

空指针检查本身很简单,难的是判断“这里到底该不该为空”以及“为空之后该怎么处理”。很多崩溃不是因为忘了写 == nullptr,而是把本该强制非空的地方当成可选路径来写。

text=ZqhQzanResources