C++11 指向堆栈内存的指针 类对象 { 公众: 对象(){} ~object(){} }; int main() { object*p=NULL; { 对象a; p=&a; 如果(p){ cout

C++11 指向堆栈内存的指针 类对象 { 公众: 对象(){} ~object(){} }; int main() { object*p=NULL; { 对象a; p=&a; 如果(p){ cout,c++11,pointers,heap-memory,stack-memory,C++11,Pointers,Heap Memory,Stack Memory,当a被销毁时,p将成为一个悬空指针。它是一个不为空的指针,但仍有未定义的行为来取消引用它 这是因为一个正在消亡的对象不会开始在程序中的任何地方更改值。如果程序中的任何地方都有一百个指向正在消亡的对象的指针,会发生什么情况?你不能只是神奇地将它们的所有值更改为nullptr。如果你想让这些指针变成nullptr,你必须影响它们重视自己。p一旦a超出范围,就不会神奇地将自己设置为nullptr。C++的可能副本提供了强大的功能,但却牺牲了巨大的责任。不要做愚蠢的事情。如果你这样做,不要期望逻辑结果。

a
被销毁时,
p
将成为一个悬空指针。它是一个不为空的指针,但仍有未定义的行为来取消引用它


这是因为一个正在消亡的对象不会开始在程序中的任何地方更改值。如果程序中的任何地方都有一百个指向正在消亡的对象的指针,会发生什么情况?你不能只是神奇地将它们的所有值更改为
nullptr
。如果你想让这些指针变成
nullptr
,你必须影响它们重视自己。

p
一旦
a
超出范围,就不会神奇地将自己设置为
nullptr
。C++的可能副本提供了强大的功能,但却牺牲了巨大的责任。不要做愚蠢的事情。如果你这样做,不要期望逻辑结果。
class object
{
public:
    object(){}
    ~object(){}
};

int main()
{
    object *p = NULL;
    {
         object a;
         p = &a;
         if(p){
             cout << "not NULL\n";
         }
         else{
             cout << "NULL ptr\n";
         }
    }
    if(p){
        cout << "not NULL\n";
    }
    else{
        cout << "NULL ptr\n";
    }
    return 1;
}