首页 > 解决方案 > 指向堆栈内存的指针

问题描述

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;
}

结果:

非空非空


我不知道为什么会出现这个结果,我认为它是“not NULL”和“NULL”。什么时候object调用了析构函数,然后p指向什么?堆栈内存是如何工作的?

标签: c++11pointersheap-memorystack-memory

解决方案


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

那是因为一个垂死的对象不会开始改变程序中各处的值。如果程序中到处都有一百个指向垂死对象的指针,会发生什么?您不能只是将它们的所有值都更改为nullptr神奇的值。如果您希望这些指针变为nullptr,则必须自己影响这些值。


推荐阅读