私はまだC++には新しく、オブジェクトスコープを研究しています。
私は下のコードをテストし、いくつかの奇妙な動作を目撃しました。オブジェクトが有効範囲外になるべきときにこのポインタが有効なのはなぜですか? (そして、他の奇妙な振る舞い)
struct Test
{
int value, value2;
Test() : value(1), value2(10) {};
};
Test* GetTestPointer() {
Test t;
t.value = 20;
return &t;
}
int main() {
Test* tp = GetTestPointer();
int a = tp->value;
int b = tp->value2;
cout << a << endl;
cout << b << endl;
return 0;
}
は出力:
20
10
私は例外または空の値を投げるだろうどちらかTest t
はとてもメインでその値を逆参照範囲の外に行くだろうと思いました。あたかもオブジェクトがまだ生存しているかのように有効な値を取得するのはなぜですか?
は、実はこれは私が最初に試したものです:
Test* tp = GetTestPointer();
cout << tp->value << endl;
cout << tp->value2 << endl;
出力:それは無効だが、私はvalue
うまく得ることができるようにここで
20
18223279
value2
が作用しています。
逆に、私はそれらを並べ替えてみました:
Test* tp = GetTestPointer();
cout << tp->value2 << endl;
cout << tp->value << endl;
出力:予想通り、私は正しく、new
でtp
を開始したとき、これのどれも起こらなかったことを
10
1459403656
注意。
私は実際にこのようなコードを書くことは決してないと知っていますが、なぜこれが起こっているのか本当に不思議です。
- この場合、
t
はどのようなときに範囲外になりますか? cout
の注文は、tp
が参照しているものと何が関係していますか?- バッファに保存すると、正しい値を取得できますか?
あなたは幸運でした。これは未定義の動作です。 – tilz0R
_このポインタは有効ですか?そうではありません。未定義の動作は未定義です。 –
「空の」値はどのように見えますか? – molbdnilo