使用 nullptr 检查空指针最安全,推荐 if (ptr == nullptr) 或 if (!ptr),避免 NULL 或 0;优先采用智能指针如 unique_ptr,其自动管理空状态并支持布尔判断,解引用前必须检查以防止段错误。

在C++中,检查指针是否为空是防止程序崩溃的重要步骤。空指针(null pointer)指的是没有指向有效内存地址的指针,直接解引用会导致未定义行为,常见于段错误(segmentation fault)。以下是常用的空指针检查方法。
使用 nullptr 进行比较
C++11 引入了 nullptr 作为空指针的推荐表示方式。检查指针是否为空,最清晰安全的方法是与 nullptr 比较。
示例:
int* ptr = nullptr; <p>if (ptr == nullptr) { // 指针为空,不进行解引用 } // 或者更常见的写法: if (!ptr) { // 等价于 ptr == nullptr }
避免使用 NULL 或 0
虽然传统上使用 NULL(通常定义为 0 或 ((void*)0))或直接写 0 来表示空指针,但它们本质上是整数常量,在函数重载等场景下可能引发类型歧义。推荐统一使用 nullptr 提高代码清晰度和安全性。
不推荐写法:
if (ptr == NULL) { ... } if (ptr == 0) { ... } </font>
智能指针自动管理空状态
现代C++推荐使用智能指针(如 std::unique_ptr 和 std::shared_ptr)代替原始指针。这些类重载了布尔转换操作符,可直接用于条件判断。
立即学习“C++免费学习笔记(深入)”;
示例:
<code>std::unique_ptr<int> ptr; <p>if (!ptr) { // 指针未持有对象 }</p><p>// 或者显式比较 if (ptr == nullptr) { // 同样有效 }
解引用前务必检查
任何对原始指针的解引用(如 *ptr 或 ptr->member)前,都应确保其不为空。尤其是在函数参数传递、动态内存分配失败(new 可能抛出异常,但 malloc 返回 nullptr)等场景下。
安全模式:
void printValue(int* ptr) { if (ptr) { std::cout << *ptr << std::endl; } else { std::cout << "Pointer is null" << std::endl; } }
基本上就这些。用 if (!ptr) 或 if (ptr == nullptr) 判断即可,优先使用 nullptr,配合智能指针能大幅减少空指针问题。不复杂但容易忽略。


