1

私は C++ と const の参照をいじっていて、なぜこのコードが機能するのか混乱しています:

#include <iostream>

class A {
public:
    A() : a_(50) {}
    const int& getA() const { return a_; }
private:
    const int a_;
};

int main(int argc, char* argv[])
{
    A* a = new A();
    const int& var = a->getA();
    std::cout << var << std::endl;
    delete a;
    std::cout << var << std::endl;
}

結果:

50
50

ここに私の考えがあります:

var は a_ への参照を格納します。
a を削除するときは、a_ も削除する必要があります。
var が再度アクセスされると、有効な参照が含まれなくなり、セグメンテーション違反が発生するはずです。

なぜこれが機能するのですか?一時的なコピーを作成するとは思いません。

4

4 に答える 4

13

を削除した瞬間a、アクセスvarは未定義の動作領域への扉になりました。

たまたま「働いている」のです。参照していたスペースvarはもうあなたのものではありませんが、今回はアクセスできませんでした。セグメンテーション違反が発生したか、50 以外の数値が返されたか、ハード ドライブが再フォーマットされた可能性があります。

機能しているように見えることは、未定義の動作が現れる可能性のある 1 つの方法であることを忘れないでください。

于 2010-02-07T18:37:38.107 に答える
3

オブジェクトを削除してもメモリはクリアされません。メモリが別の目的で使用されるまで、値はそのまま残ります。ということで、しばらくは使えるかも……。

一部の C++ 実装には、このようなバグを検出するために、削除されたすべてのメモリに特定の値を設定する「デバッグ モード」があります。

于 2010-02-07T18:40:13.973 に答える
2

a を削除すると、メモリが解放され、後者の new がそれを上書きできるようになります。それまでは、削除されたオブジェクト内のすべての変数はメモリ内に残りますが、いつでも上書きされる可能性があります。

于 2010-02-07T18:41:02.563 に答える