2017-10-16 12 views
-2

を呼ば変更するとき、私はのconstネスおよびメンバー関数と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

メンバーとしての参照は、一般的には良い考えではありません。これは、特にconstとの関係はありません。 –

答えて

4

コードでは、コンストラクタは値によってint引数をとります(一時コピーが作成されます)。次に、その一時的な参照への参照を格納します(コンストラクタが終了するとスコープの外に出るため、参照がありません)。 changeValue関数は、未定義の動作と(あなたの場合(コンパイラは何でもを有効に完了した可能性がありますが)そのクラッシュにつながる、そのダングリングリファレンスを介して、長いデッドの一時的な値を更新しようとします。

関連する問題