2016-07-25 2 views
-3

"への参照" の本は述べています。retrurning一時変数

本はまだ正しいと言いますか?自動記憶域期間と長期変数の一時変数の使用が唯一の混乱に追加されますが、

おかげ

+0

本書は*ほとんど*正しいですが、 'newguy'は一時変数ではありません。これは、寿命が終わるローカル変数です。 – Brian

+1

本はその章で定義されていない動作について実際に言及していますか?そうでない場合は、よく.... – LogicStuff

+0

変数が存在しなくなると、おそらく同じ値を持つメモリが存在しますが、空きとしてマークされたメモリなので、動作は未定義です。多くのプログラムはこのようなエラーで何度も動作する可能性がありますが、この空きメモリが変更されるため、いつでも動作を停止します。 – EFenix

答えて

2

本は、正しいです。さらに、本書では、プログラムの振る舞いがで定義されていないことを除いて、が省略されているようです。

したがって、実行していることが合法であるという印象を与えるなど、コンパイラは何かを行うことができます。

短い回答:do not do

+0

これは私の初期の考えでしたが、拡張子は*推移的ではないので、拡張子はここで適用されます。 – Bathsheba

+2

@cplusplusratライフタイム拡張は 'return'ステートメント内では適用されません。事実、オブジェクトはそのスコープを超えて生き残ることはできません。多くても一時的には、それが作成される範囲の終わりまで生き残ることができます。 – Brian

+0

ありがとうございます。私はMicrosoftのVisual Studioを使用しています。私はそれが動作するのを見たとき、それは私をたくさん心配した。 MVSが警告を発することに気付きました。 – user9418

0

ローカル変数newguyは、スタックメモリに作成/割り当てされます。いくつかのローカル変数を持つ別の関数を呼び出して値を代入すると、newguyのメモリを上書きします。したがって、clone2への呼び出しの後で変数にアクセスすると機能するかもしれませんが、newguyにアクセスする前に他の関数を呼び出すと、元のコンテンツがnewguyにならない場合があります。 だからそれをするのは良い考えではありません;-)

関連する問題