检查悬空指针的值是安全的还是未定义的行为?

Ita*_*iwa 11 c++ pointers dangling-pointer

我们只能取消引用有效的指针,并且只能检查悬空内置指针指向的地址。我们无法访问它的值(它指向的对象地址中的值)。

int* ptr = nullptr;
if(ptr) // != 0x00000000
   std::cout << *ptr << '\n';

ptr = new int(1000);

if(ptr) // != 0x00000000
   std::cout << *ptr << '\n';

delete ptr; // still pointing at the address of that dynamic object but that object has been destroyed.

if(ptr) // succeeds or undefined behavior?
   std::cout << *ptr << '\n'; // of course UB here
Run Code Online (Sandbox Code Playgroud)

所以我很清楚,但我关心的只是检查指针值是否安全或产生 UB?if(ptr)。因为我们假设我没有像 那样访问该地址中的值std::cout << *ptr

eer*_*ika 4

检查悬空指针的值是安全的还是未定义的行为?

它不是 UB (C++14 起),但“安全”取决于您的期望。无法保证此类检查的结果。这可能是真的,也可能是假的。假设指针有效的基础if(ptr)通常是不安全的。