2017-10-16 60 views
-2

我已經做了一些實驗在C++與常量性和成員函數,以及我寫以下代碼:
特權指令異常稱爲INT

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

「MyClass」構造函數的參數就像局部變量一樣,在構造函數體返回時超出範圍。現在猜猜'refToInt'會引用什麼......嘗試通過引用來傳遞參數。 –

+4

由於使用懸掛參考引起的未定義行爲。 –

+0

成員引用通常不是一個好主意。這與常量沒有任何特別的關係。 –

回答

4

在你的代碼中,構造函數按值創建一個int參數(它創建一個臨時副本)。然後,您存儲對該臨時文件的引用(一旦構造函數完成,該引用就會超出範圍,因此您有一個懸而未決的參考)。 然後你的changeValue函數嘗試通過那個懸空引用更新long,long臨時值,導致未定義行爲和(在你的情況下(儘管編譯器可以有效地完成)任何崩潰)。