2012-06-30 25 views
5

this question私はちょっと混乱しました。 C++のコピーセマンティクスのため、これは問題なく動作します。ヒープと参照のオブジェクト

int *some_obj = new int(42); 
int a_copy = *some_obj; 

delete some_obj; 

printf("The answer is %d\n", a_copy); 

これはどうですか?

int *some_obj = new int(42); 
int& a_ref = *some_obj; 

delete some_obj; 

printf("The answer is %d\n", a_ref); 

これは削除されたメモリにアクセスしていますか?

さまざまな形でさまざまなことが尋ねられますが、これはGoogleにとってはあまり面白くありません。地獄、私はまともなタイトルを作ることができませんでした。

答えて

4

はい、あります。それは許可されていません。 (値を変更するデストラクタを持つクラスを使用することで違いを確認することができます)

+0

ここで私はWikipediaのページの一部を読んだので、[このセクション]の最後の段落で非常に明確に説明しています(http://en.wikipedia.org/wiki/Reference_(C%2B%2B )#Relationship_to_pointers)。一時オブジェクトへの参照を返すのはどうですか?(Aはいくつかのランダムなクラスです) 'A&func(){return A(); } '? – orlp

+0

同じ問題があります。呼び出し元がそれを取得したときに存在しなくなったオブジェクトへの参照を返しています。 –

+0

説明していただきありがとうございます。 – orlp

1

正確に。 2番目の例は、解放されたメモリにアクセスします。参照の実装はポインタです。非常に簡単です。参照は、変更できないポインタであり、アクセス演算子の表記が異なります。それ以外に違いはありません。

関連する問題