2017-12-05 11 views
-5

私に正しい値を示しています戻るローカル変数は、まだ私は、このクラスを持っている

class A 
{ 
private: 
    int a; 
public: 
    int getA(); 
    void setA(int a=2) ; 
}; 

と機能:

A& func() 
{ 
A a; 
a.setA(777); 
return a; 
} 

とメインで:

A a; 
a=func(); 
cout<<a.getA(); 

と私"777"を得る。 しかし、関数内のローカルの "a"が削除されているので、私にはそれを得ることができないはずです。なぜ私は正しい価値を得るのですか?

+0

この値を正確に「正しい」ものにするにはどうすればよいですか?あなたはその価値を得るべきではないことをあなたが知っていると言いませんでしたか?あなたがそれを得るべきでないなら、それはどのように正しいことができますか? –

+0

[C++ローカル変数への参照の返却]の可能な複製(https://stackoverflow.com/questions/4643713/c-returning-reference-to-local-variable) – tofro

+1

[ローカル変数のメモリを外部にアクセスできるかその範囲?](https://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope) – moooeeeep

答えて

1

コードの動作がであるため、は未定義であり、少なくとも1回は正しく動作するように見えるため、未定義の動作が許容されます。

"777":NULで終了するconst char[4]タイプを取得することもできます。

0

すでにBathshebaと同様に、一時変数への参照を返すと、未定義の動作が発生します。

残念ながら、私の経験では2つの悪いことはこのについて一緒に来る:

  • により、コンパイラの構造に、参照は非常に頻繁にあなたの例のように、「一見」正しいだろう。
  • "一時参照への参照"は、エラーではなくコンパイラの警告のみを発行します。

この問題は、この非常に重要なプレゼンテーションの日まで、数年間でも簡単に逃して作業することができるため、この問題は非常に危険です。

解決方法この警告はエラー(コンパイラのフラグについてはコンパイラのドキュメントを参照)として扱うか、すべての警告をエラーとして扱います。

関連する問題