2

このコードが機能する理由 (値を返す理由) を誰かに説明してもらえますか?

int main()
{
    int *ptr = new int(113);
    int &rPtr = *ptr;

    delete ptr;

    cout << rPtr << endl;

    return 0;
}

基本的に、これは私が得る戻り値です:

-572662307
4

3 に答える 3

3

あなたがしていることは未定義の動作をもたらすため、この数値を取得しているという事実は完全に合理的な動作です.

このシーケンスを実行すると:

int *ptr = new int(113);
int &rPtr = *ptr;

参照rPtrは、行で作成した整数を参照するようになりましたnew int(113)。次の行で、実行します

delete ptr;

これにより、その が削除されintます。つまり、オブジェクトは存在しなくなります。それへのポインターまたは参照は、未定義の動作を引き起こす割り当て解除されたオブジェクトを参照するようになりました。その結果、あなたがで印刷rPtrするとき

cout << rPtr << endl; 

何でも起れる。ここでは、ガベージ データを取得しているだけですが、プログラムは簡単にクラッシュしたり、デバッグ エラー メッセージを報告したりする可能性があります。

興味深いことに、出力した値 (-572662307) は、32 ビットの符号なし値として扱われ、0xDDDDDDDD です。これは、メモリ アロケータが解放されたメモリに値を入れて、このようなメモリ エラーをデバッグするのに役立つに違いありません。

お役に立てれば!

于 2012-07-06T21:44:39.780 に答える
0

未定義の動作を呼び出しています。ポインターを削除すると、参照は無効になります。

int *ptr = new int(113);
int &rPtr = *ptr;
//rPtr references the memory ptr points to
delete ptr;
//the memory is released
//the reference is no longer valid
cout << rPtr << endl;
//you try to access an invalid reference
//anything can happen at this point
于 2012-07-06T21:43:36.940 に答える
0

オブジェクトの参照はすべてのブロック スコープ (この場合は関数スコープ) で生きているため、ポインタを削除すると、このアドレスにゴミがあり、出力に表示されます。

于 2012-07-06T21:43:44.280 に答える