超出范围时,是否已释放堆栈变量?

时间:2018-08-31 05:58:06

标签: c++ c++11

sample1.cpp

#include <iostream>

int main()
{
    int* aPtr = nullptr;

    {
        int a = 3;
        aPtr = &a;
    }

    std::cout << *aPtr << std::endl;

    return 0;
}

输出

3

我能够通过a访问aPtr

  1. 这是否意味着a即使在退出后也没有被释放 范围。
  2. 这是否意味着a仅在函数 它定义的展开。
  3. 这是当前输出一些值的不确定行为吗?

sampe2.cpp

#include <iostream>

struct Box
{
    Box(int a_)
        :a(a_)
    {}

    int getValue() const { return a;}

    ~Box()
    {
        std::cout << "Destructor called" << std::endl;
    }
private:
    int a;
};


int main()
{
    Box* boxPtr = nullptr;

    {
        Box box = 23;
        boxPtr = &box;
    }

    std::cout << boxPtr->getValue() << std::endl;

    return 0;
}

输出

Destructor called
23

即使调用了box的析构函数,我也可以通过boxPtr访问box

1 个答案:

答案 0 :(得分:1)

如评论中所述,在两种情况下,您都面临不确定的行为(因此,任何事情都可以发生)。堆栈变量一旦超出范围就会被销毁,它们所占用的内存将被释放,尽管通常它不会立即被覆盖(至少在上述简单情况下如此),因此指向该变量的指针有时可能会显示更多或更少的“有效”属性(看起来像对象仍然有效),尽管它显然是悬空的。