未初始化指针比NULL更危险,因其值随机且不可检测,解引用易导致隐蔽内存破坏;NULL和nullptr虽均为“空”,但nullptr类型安全、重载明确;初始化为nullptr仅保障声明安全,使用前仍需显式判空。

不初始化就用,等于把程序交给随机数决定命运
为什么未初始化的指针比NULL更危险
未初始化的指针(比如 int* p;)值是完全不确定的:可能是 0、可能是 0xdeadbeef、也可能是某段代码或栈上某个变量的地址。它不是“空”,而是“野”——if (p == nullptr) 根本拦不住它,解引用时可能悄无声息地改写其他变量,也可能立刻崩溃,但崩溃点和现象每次都不一样,极难复现。
- 编译器不会报错,甚至不警告(除非开
-Wuninitialized且能静态推断) - 在 Release 模式下,优化可能让野指针行为更诡异(比如寄存器残留值被当地址用)
- 调试时看到的地址常是合法范围内的值,容易误判为“只是还没赋值”,实则已踩内存
NULL 和 nullptr 都是“显式可知的空”,但行为不同
NULL 是宏,本质是整数 0 或 0L;nullptr 是类型为 std::nullptr_t 的字面量。二者都能让指针处于可检测、不可解引用的安全状态,但关键区别在重载和模板推导:
-
func(NULL)可能调到func(int)而非func(char*),这是真实翻车现场 -
func(nullptr)只会匹配指针参数重载,类型安全 -
template<typename T> void foo(T*)接收nullptr时能正确推导出T,而NULL会推导成int导致编译失败
初始化为空不是终点,而是检查起点
把指针初始化为 nullptr 的真正价值,不在“让它安全”,而在“让后续逻辑能明确判断”:
立即学习“C++免费学习笔记(深入)”;
- 所有指针使用前加
if (p != nullptr)成为可读、可测、可静态分析的习惯 - RAII 类中成员指针初始化为
nullptr,析构时可统一判空释放,避免重复 delete 或 delete nullptr(后者虽安全但掩盖设计问题) - 函数返回指针时,用
nullptr表达“未找到/失败”语义,比返回任意非空非法地址更清晰
最易被忽略的一点:初始化为 nullptr 只解决“声明即安全”的问题,不解决“后续是否分配了有效内存”。char* p = nullptr; memcpy(p, "hi", 3); 依然崩——空指针不能解引用,这个检查必须由人写出来,编译器不会替你补。


















