0

次のプログラムを検討してください。

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

4

1 に答える 1

2

これは、メモリアロケータがたまたま機能する方法です。あなたのコードで:

delete ptr;
ptr = new int(100);

1つを削除intしてから、すぐに新しいものを要求します。ランタイムは、「いいよ、これを持って。ちょうど利用可能になった」と言います。

シンプルなリサイクル。

于 2013-04-02T11:29:40.080 に答える