【发布时间】:2021-09-30 19:28:01
【问题描述】:
我们只能取消引用一个有效的指针,我们只能检查一个悬空的内置指针指向的地址。我们无法访问它的值(它指向的对象地址中的值)。
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
所以对我来说很清楚,但我唯一关心的是检查指针值是安全的还是产生 UB? if(ptr)。因为假设我没有像std::cout << *ptr 那样访问该地址中的值。
【问题讨论】:
-
不幸的是,检查指针是否为
nullptr并不能检查指向的对象是否已被销毁。 (显然,如果指针是nullptr,则没有指向对象,但反面不成立。) -
@fabian:非常感谢!这是我的错,我忘记了指针运算符,
-
这是自 C++14 以来实现定义的行为,在 C++14 之前未定义:stackoverflow.com/questions/44182049/pointers-in-c-after-delete
标签: c++ pointers dangling-pointer