次のプログラムを検討してください。
include <iostream>
using namespace std;
int main()
{
int *ptr = new int(10);
int &ref = *ptr;
cout << ref << endl << &ref << endl;
delete ptr;
ptr = new int(100);
cout << ref << endl << &ref << endl;
return 0;
}
出力:
10
0x80010348
100
0x80010348
ここで、ref
変数は が指すメモリ位置への参照ptr
です。ただし、ptr
ポインタが削除され、新しいメモリ ロケーションが割り当てられるref
と、以前のメモリ ロケーションが存在しないため、未定義のメモリ ロケーションを参照する必要があります。しかし、このプログラムを実行すると、cygwin/linux および VC++2012 Express で g++ を使用して ref を介して更新された値とアドレスを取得します。
ただし、ptr が削除されていないref
場合は更新されず、出力には古い値 10 と古いアドレスが表示されます。この動作は標準ですか、それともコンパイラ固有ですか? それが標準の場合、更新が削除されref
たかどうかに依存するのはなぜですか?ptr