0

これは私が信じていることです:

関数が返されると、オブジェクトの新しい一時コピーが作成され、この一時オブジェクトは、それが呼び出された場所からステートメントが実行されるまでメモリに残ります。

関数が参照を返すと、そのオブジェクト自体が返されます。これは、そのオブジェクトがローカルであってはならないことを意味します。

だから私はこれを行うとき:

 MyStruct & ReferenceReturn(MyStruct cl)
 {
         return cl;
 }

main() で私は

MyStruct d("notmyname"),g("myname");
d = ReferenceReturn(g);
cout << d.name;
cout << ReferenceReturn(g).name;

両方にゴミを印刷します。

何が返されますか? : 関数が終了するとすぐに破棄される g ie cl のローカル コピーへの参照、またはステートメントの終了後に破棄される一時オブジェクトへの参照。しかし、temp が作成されていれば、d は正しい方法で上書きされていたはずです。したがって、渡された値のローカルコピーの参照が返されると思います。

しかし、構造体でデストラクタを作成するとすぐに、次のコードと特定の出力で完全に機能しました。

 ~MyStruct()
 {
   cout << name << " is destroying";
  }

出力:

myname is destroying
myname
myname
myname is destroying
.... 

この出力は、呼び出しごとに 1 つのオブジェクトのみが作成されることを示しています。(2回の呼び出しがあります)

しかし、なぜデストラクタなしでは機能しないのでしょうか?

ありがとう

4

2 に答える 2

2
 MyStruct & ReferenceReturn(MyStruct cl)
 {
         return cl;
 }

を作成temporary objectし、 に代入しcl、オブジェクトに戻しreference、オブジェクトを破棄します。だから、それはdangling referenceです。コンパイラはcopy-elisionオブジェクトを使用でき、コピーできませんが、できません...何かを使用してください

 MyStruct & ReferenceReturn(MyStruct& cl)
 {
         return cl;
 }
于 2012-08-25T18:09:38.813 に答える
1
 MyStruct & ReferenceReturn(MyStruct cl) {
    return cl;
 }

そのような場合の結果は未定義ですか?

その関数は未定義の動作を示します、はい。問題は、それclが関数内のローカル オブジェクトであり、それへの参照を返していることです。これは未定義の動作です。呼び出し元はgに渡される のコピーを作成し、そのコピーは の後、呼び出し元が参照を使用する前に関数ReferenceReturnによって破棄されます。ReferenceReturnreturn

于 2012-08-25T18:26:11.830 に答える