为什么这个堆栈变量虽然超出了范围,但不会被覆盖?

Che*_*ery -1 c++ stack pointers

AFAIK,在堆栈上声明的变量只在当前范围结束之前有效,所以基本上直到下一个}出现。但是,让我们以这个例子为例:

int main() {
    int* ptrOne;
    {
        int intOne = 1;
        ptrOne = &intOne;
    }
    int intTwo = 9;

    std::cout << *ptrOne;
}
Run Code Online (Sandbox Code Playgroud)

intTwo被宣布,intOne已经超出了范围。它不再可访问,因此应该被覆盖。但是,cout仍然有效并推出1. 在内存视图中,我可以看到 1 仍然存在,而 9 在其后面写入了几个字节。为什么?(我使用的是带有 MSVC 的 Visual Studio 2019)

joh*_*ohn 5

它不再可访问,因此应该被覆盖。

不正确,正确的说法是it is no longer accessible and so the program has undefined behaviour。您无法对具有未定义行为的程序进行推理,它们可以做自己喜欢的事情。