1

私は C++ (iOS から) を学んでおり、ポインタ/参照の使用法を理解したいと思っています。

オブジェクトが削除されたときにオブジェクトの参照を操作するのは正しいですか? それとも、参照された変数も削除されますか?

例:

Class Foo {
}

Class Faa{
   asyncCall(&Foo)
}

1.

// ...
Foo *foo = new Foo();
faa->(asyncCall(&foo);
delete foo;
// ...

2.

// ...
Foo *foo = new Foo();
Foo& refFoo = foo;
delete foo;

// do something with refFoo
4

5 に答える 5

7

あなたのコードサンプルは意味不明なので、私は自分自身を提起します:

Foo* foo = new Foo();
Foo& ref = *foo;
delete foo;

// Use refFoo

これは悪いです。参照は、別の場所で作成されたオブジェクトを参照するだけです。この例では、*foorefはまったく同じオブジェクトです。を実行してそのオブジェクトを破棄するとすぐに、delete foo;ぶら下がっrefたままになります。もう存在しないオブジェクトを参照しています。アクセスすると、未定義の動作が発生します。

于 2013-03-08T13:00:51.377 に答える
4

C++ での参照は、Java、C#、またはその他のガベージ コレクション言語での参照と同じではありません。ほとんどの実用的な目的では、C++ 参照は、逆参照する必要のないポインターと考えることができます*。オブジェクトへの参照を作成しても、その有効期間は延長されません。そのため、参照を介して削除されたオブジェクトにアクセスすることは、2 番目のポインターを介して削除されたオブジェクトにアクセスするのと同様に問題があります。これは未定義の動作です。


* ただし、参照はポインタではありません

于 2013-03-08T12:58:54.500 に答える
1

オブジェクトを削除すると、それはなくなります。そのオブジェクトを参照するもの (ポインター、参照) はすべて無効になります。

于 2013-03-08T13:02:08.983 に答える
0

&参照を意味するか (宣言のようにasyncCall(&Foo)- 戻り値とパラメーターのデータ型を見逃しています)、または (のようにasyncCall(&foo)) のアドレスを取得します。

また、C++ にほぼ似ていて、より適切にコンパイルできるコードをいくつか用意することも役立ちます。

于 2013-03-08T12:59:58.157 に答える