跟踪对象和引用

out*_*ind -4 c++

如果我们注释掉下面强调的行,我们在控制台中得到777.否则我们得到一些垃圾(-534532345).我的环境是Microsoft Visual Studio 2012 Pro.

class C
{
public:
    C () { x = 777; }
    void ou() {cout << x;}
protected:
    int x;
};

class A
{
public:
    A(C & rrc) : rc(rrc) {};
    void koo () {rc.ou();}
protected:
    C & rc;
};

int _tmain(int argc, _TCHAR* argv[])
{
    C c;
    C * pc = new C;
    A a(*pc);
    delete pc; // <<<< this line
    a.koo();

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

任何人都可以帮我弄清楚为什么我会看到这种行为?

pho*_*ger 7

在您调用a.koo()时,您已删除其rc引用所引用的基础对象.那当然是UB.接下来发生的事情可能是在给定平台上针对给定编译具有一致行为,甚至可能输出777(实际上,由于基础对象最近被删除,可能会输出777).在您的情况下,似乎先前已分配给_tmain()pc对象的内存已被重新分配给已覆盖它的其他内容,或者您​​正在使用其内存分配器显式覆盖已删除/已释放的调试版本内存与一些固定的值,通常为零,且不是所有的人,但东西是可识别的,否则像0xAAAAAAAA或0xDEADDEAD.由于-534532345是0xE023AF07(或0xFFFFFFFFE023AF07),我猜它是前者(内存已被分配给其他覆盖它的东西).由于紧接着你的例子中对a.koo()的调用delete pc,我发现它很快就被覆盖了,但是技术上任何事情都可能,因为它是UB.