释放指针后应将指针赋值为空或其他有效值
14.22 ID_missingResetNull
释放指针后,指针处于失效状态,应立即使用空指针常量或有效地址对其赋值,以避免意料之外的错误。
非空指针的有效性难以仅通过值来判断,指针失效后易被误用,尤其是全局或成员指针,因此应时刻保持指针处于有效状态,以增强程序的健壮性。本规则是避免“重复释放”和“指针悬挂”等问题的有效措施,参见 ID_doubleFree、ID_danglingDeref。
示例:
int* p;
void foo() {
....
free(p);
} // Non-compliant
void bar() {
if (p) { // May be invalid
*p = 1;
}
}
例中 foo 函数释放指针后未将其赋值为空指针,后续对指针有效性的判断可能会是错误的,应改为:
void foo() {
....
free(p);
p = NULL; // Compliant
}
例外:
void baz() {
int* p = (int*)malloc(8 * sizeof(int));
....
free(p);
} // Let it go
如果非静态局部指针的生命周期在释放后立即结束,可不受本规则限制。