#include <iostream>
int main()
{
int* aPtr = nullptr;
{
int a = 3;
aPtr = &a;
}
std::cout << *aPtr << std::endl;
return 0;
}
输出
3
我能够通过a
访问aPtr
。
a
即使在退出后也没有被释放
范围。 a
仅在函数
它定义的展开。 #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
。
答案 0 :(得分:1)
如评论中所述,在两种情况下,您都面临不确定的行为(因此,任何事情都可以发生)。堆栈变量一旦超出范围就会被销毁,它们所占用的内存将被释放,尽管通常它不会立即被覆盖(至少在上述简单情况下如此),因此指向该变量的指针有时可能会显示更多或更少的“有效”属性(看起来像对象仍然有效),尽管它显然是悬空的。