gcc:通过使用引用可以访问被破坏的堆栈变量?

-1 c++ gcc pointers reference dereference

可能重复:
可以在其范围之外访问局部变量的内存吗?

请考虑以下简单的C++代码:

#include <iostream>

struct Test
{
    Test( int i )
        :   ref( i ),
            ptr( &i ) {}

    int &ref;
    int *ptr;
};

int main()
{
    Test t( 5 );

    std::cout << t.ref << std::endl;
    std::cout << *t.ptr << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Test类存储指针和对生活在堆栈上的局部变量的引用.我会假设从Test构造函数返回后我被破坏了.但显然事实并非如此.因为这是程序的输出:

5
134513968
Run Code Online (Sandbox Code Playgroud)

访问指针的结果是我所期望的:随机值随每次运行而变化.但是引用访问总是导致5 - 只是局部变量i仍然存在.

任何人都可以向我解释这种行为吗?我在64位Linux(版本4.6.3)上使用g ++.

此致,enuhtac

Set*_*gie 6

访问被破坏的变量会导致未定义的行为.它印刷的只是巧合5; 它可以打印-4390843或者hello world,撞坏你的电脑,点燃气氛,或用你的信用卡买披萨.

此外,尝试猜测发生了什么并没有意义,因为编译器在生成程序集时可以使用代码执行一些非常奇怪的操作.这是徒劳的练习(但如果你真的想知道所有的位来自哪里以及它们去过的地方,那就调试一下).

  • 我在哪里可以得到一些像@@@@@@ - "SEGFAULT Pizza"的崩溃行为 (3认同)