我一直在使用常量和成员函数在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.
为什么我的代码会导致异常?
答案 0 :(得分:4)
在您的代码中,构造函数按值int
参数(创建临时副本)。然后,您存储对该临时的引用(一旦构造函数完成,它就会超出范围,因此您有一个悬空引用)。
然后,您的changeValue
函数会尝试通过悬空引用更新long dead,临时值,从而导致未定义的行为(在您的情况下(尽管编译器可以有效地完成任何 ))崩溃。