空指针 · 野指针 · 悬垂指针 —— 三种危险
指针错误的三种典型形态,以及对应的安全写法(nullptr 初始化 · delete 后置空 · 先判空再解引用)
① 野指针
未初始化,指向随机地址
int *p;
*p = 9; // 写入未知地址
p
0x????
?
未定义行为 / 可能崩溃
✓ 正确写法
int *p = nullptr;
先赋有效地址再解引用
② 解引用空指针
nullptr 不指向任何对象
int *p = nullptr;
*p = 9; // 解引用空指针
p
0x0 (null)
空
运行期崩溃 (segfault)
✓ 正确写法
if (p) *p = 9;
解引用前先判空
③ 悬垂指针
指向已被释放的内存
int *p = new int(9);
delete p;
*p = 5; // p 仍指旧地址
p
0x5f…c8
堆 heap
9
已释放
访问失效内存 · 未定义行为
✓ 正确写法
delete p; p = nullptr;
释放后立即置空
口诀:定义即初始化 nullptr · 解引用前先判空 · delete 之后立刻置空
▶ 重播