检查悬空指针的值属于安全操作还是未定义行为(UB)?
结论
仅读取指针本身的值做判断(例如if(ptr)这类操作)是完全合法的安全操作,不会触发未定义行为,只有对无效指针执行解引用、访问其指向对象的操作才会产生UB。
细节解释
- 按照C++标准规定,读取指针变量本身存储的地址值,不需要该指针指向的对象处于有效状态。无论是空指针、还是指向已经被销毁对象的悬空指针,它们本身存储的地址值都是可以合法读取、判断的。
- 你示例代码中执行
delete ptr之后,指针变量ptr自身存储的地址并不会被修改,仍然是之前动态申请的内存地址(非空),所以这时候的if(ptr)判断会返回真,这步操作本身没有任何问题,未定义行为只出现在后续的*ptr解引用操作。 - 常见的认知误区是把"指针指向的内存无效"等同于"指针变量本身无效",实际上后者是栈上(或其他存储区)的普通变量,读写它的值全程都是合法的,只有试图通过它访问已经失效的目标内存时才会出问题。
开发建议
为了避免后续不小心对悬空指针执行解引用,建议每次执行delete操作后主动将指针置为空:
delete ptr; ptr = nullptr; // 主动置空后,后续if(ptr)就能正确识别出指针不可用
内容的提问来源于stack exchange,提问作者Itachi Uchiwa
相关产品推荐
相关产品推荐

