1

以下のC++コードを試しました

#include <iostream>
using namespace std;

int main()
{
    int *p = new int;
    *p = 10;
    int &a = *p;
    delete p;
    a = 20;
    cout<<a<<" ";
    cout<<*p;
    return 0;
}

次のように出力されました:20 20

これにより、解放されたメモリまたはゴミにアクセスした結果、実行時エラーが発生する可能性があると考えました。おそらく、プログラムによって解放されたメモリ位置がこれまで使用されていない可能性があり、古い値が保持されているため、この出力が得られました。

だから私は参照を使用しない場合にも起こるはずだと思った

#include <iostream>
using namespace std;

int main()
{
    int *p = new int;
    *p = 10;
//  int &a = *p;
    delete p;
//  a = 20;
//  cout<<a;
    cout<<*p;
    return 0;
}

しかし、この場合、出力は 0 でした (複数回の実行でチェック)。Reference はさまざまな出力と関係がありますか?

コンパイラ: gcc バージョン 4.7.2 (Ubuntu/Linaro 4.7.2-2ubuntu1)

4

2 に答える 2

2

解放されたメモリを逆参照しています。これは未定義の動作です。結果がどうなるかは保証できません。たまたま、コンパイラ、オペレーティング システム、および C++ ライブラリの組み合わせで、プログラムが動作しているように見えます。

これは、未定義の動作の可能性のある結果の 1 つです。

于 2013-02-16T15:45:48.310 に答える
1

delete-dメモリの間接参照は未定義の動作であり、別のコンパイラまたは同じコンパイルの別のリリースに切り替えると破損する可能性があるため、一部のパターンを理解する意味はありません。

delete非プリミティブ型のデストラクタを呼び出します。破棄されたときにコンテンツをクリアするラッパーがある場合は、class Integerいくつかの違いがあります。プリミティブ型では、解放されたスペースを再初期化しませんdeleteしたがって、元の値が保持されていることがわかる場合がありますが、これが完全に機能することは保証されておらず、決して信頼しないでください。

于 2013-02-16T15:57:17.890 に答える