【发布时间】:2020-07-04 08:43:42
【问题描述】:
AFAIK,在堆栈上声明的变量只存在于当前范围结束之前,所以基本上直到下一个 } 出现。但是,让我们举个例子:
int main() {
int* ptrOne;
{
int intOne = 1;
ptrOne = &intOne;
}
int intTwo = 9;
std::cout << *ptrOne;
}
当intTwo 被声明时,intOne 已经超出范围。它不再可访问,因此应该被覆盖。但是,cout 仍然有效并输出1。在内存视图中,我可以看到 1 仍然存在,而 9 在其后面写入了几个字节。为什么? (我正在使用带有 MSVC 的 Visual Studio 2019)
【问题讨论】:
-
这是未定义的行为。谁知道会发生什么?
-
因此应该被覆盖。 -- 你从哪里得到这样的想法?永远不要假设编译器做了什么,除非您自己编写了代码并且知道做了什么,或者它记录了(在 C++ 标准中,由编译器供应商等)做了什么。