1

重複の可能性:
ローカル変数のメモリにそのスコープ外でアクセスできますか?
ローカル変数への参照を返す

これは、関数内のローカルクラスオブジェクトのスコープをチェックするために作成されたサンプルプログラムです。ここでは、クラスAのオブジェクトを作成し、それに値を割り当てて、の参照によってそのオブジェクトを返しますFunction()。変数のスコープがいつ終了するか知りたいのですが、スタックオブジェクト(ポインタではない)なので、Function()の最後で破棄されますか?もしそうなら、その参照値が新しいオブジェクトに割り当てられるとどうなりますか?

  #include "stdafx.h"
  #include <iostream>

  class A
  {
  public:
    int a, b;
    A(int aa, int bb)
    {
      a = aa;
      b = bb;
    }
    A(){}
  };

  A& Function()
  {
    A object;
    object.a = 10;
    object.b = 20;
    return object;
  }

  int _tmain(int argc, _TCHAR* argv[])
  {
    A aaa = Function();
    std::cout<<"\nValue : "<<aaa.a<<" "<<aaa.b;
    getchar();
    return 0;
  }
4

4 に答える 4

2

スタックオブジェクト(ポインタではない)なので、Function()の最後で破棄されますか?

はい。

もしそうなら、その参照値が新しいオブジェクトに割り当てられるとどうなりますか?

未定義の動作。

返す目的で何かを作成している場合は、値で返します。それが価値観の目的です。

于 2012-06-07T11:04:44.033 に答える
2

何が起こるのですか?

未定義の振る舞いが起こります!

スタックに割り当てられたオブジェクトはローカル/自動です。これらのオブジェクトのすべての割り当ては、それらが存在するscope(、)が終了すると 、暗黙的にクリーンアップされるためです。{}

ローカルオブジェクトへの参照を返すことは、未定義の動作です。
未定義の動作とは、文字通りあらゆる動作が見られることを意味します。プログラムが動作するか、クラッシュするか、ランダムに動作する可能性があります。ただそれは有効なc++プログラムではなく、何かが起こる可能性があります。

于 2012-06-07T11:04:57.017 に答える
0

あなたの質問はここで答えられると思います:C ++では、参照を介してスコープを拡張するのは安全ですか? しかし、それはやや古いです。C ++ 11、右辺値参照、および移動セマンティクスを調べることをお勧めします。

于 2012-06-07T11:23:33.127 に答える
0

オブジェクトは、の終わりで破棄されますFunction()。値渡しメカニズムによってデータを返します。

于 2012-06-07T11:09:36.453 に答える