修改引用的

时间:2017-10-16 17:04:31

标签: c++ exception

我一直在使用常量和成员函数在C ++中进行一些实验,并且我已经编写了以下代码:

using namespace std;
#include <iostream>

class MyClass {
public:
    int& refToInt;
    MyClass(int x) : refToInt(x) { ; }
    void changeValue() const { refToInt++; }
};

int main() {
    int x = 10;
    MyClass mc(x);
    mc.changeValue();
    cout << mc.refToInt;
    return 0;
}

代码编译,但是当它执行mc.changeValue();时会抛出异常:

Unhandled exception at 0x00AB1884 in tests.exe: 0xC0000096: Privileged instruction.

为什么我的代码会导致异常?

1 个答案:

答案 0 :(得分:4)

在您的代码中,构造函数按值int参数(创建临时副本)。然后,您存储对该临时的引用(一旦构造函数完成,它就会超出范围,因此您有一个悬空引用)。 然后,您的changeValue函数会尝试通过悬空引用更新long dead,临时值,从而导致未定义的行为(在您的情况下(尽管编译器可以有效地完成任何 ))崩溃。