2012-02-21 13 views
-1
int& lameness() 
{ 
    int h=66; 
    return h; 
} 
int main() 
{ 

    int c; 
    c = lameness(); 
    cout<<"c is "<<c<< endl; 
    system("pause"); 
    return 0; 
} 

これはなぜ機能しますか? int hはローカル変数であり、関数スコープを終了すると破棄すべきではありませんか?C++単純参照型関数

これに私の機能を変更すると、警告なしで動作します。これはどんな点でより安全ですか? :

int& lameness() 
{ 
    int h=66; 
    int &a = h; 
    return a; 
} 

答えて

1

これは機能しません。これは未定義の動作です。あなたの懐疑主義は正しかった:lameness関数はエラーであり、一部のコンパイラはそのようにフラグを立てるだろう。それにもかかわらず、コンパイラは "準拠"していて、このコードを "許可"しています... CやC++の "跛行"などです。

1

破壊されています。 hが保存されているメモリは、値を印刷するときに上書きされていないため、動作します。

4

はい。しかし、未定義の振る舞いについての素晴らしいことは、実際に起こるのは未定義であるということです。 intを破棄するには実際には何もしないので、スタック上のその場所を何も再利用しなければ、その値はまだそこに残っています。これは、このようなことをとてもイライラさせるものです。あなたが小さくて、一見無関係な変化を作り、それが機能しなくなるまで、しばしばうまくいくようです。

1

これは、偶然にのみ機能します。また、他の操作を行う前にコード内の値のコピーが参照に使用されるためです。働くことは保証されません。あなたがで失敗し、それを見ることができました

もちろん
#include <iostream> 
using namespace std; 
int& lameness() 
{ 
    int h=66; 
    return h; 
} 
int main() 
{ 
    int &c = lameness(); 
    cout << "c is " << c << endl; 
    return 0; 
} 

、私はコンパイル警告を無視しなければならなかった:

x.cpp: In function ‘int& lameness()’: 
x.cpp:5:13: warning: reference to local variable ‘h’ returned [enabled by default] 
x.cpp: In function ‘int main()’: 
x.cpp:12:28: warning: ‘h’ is used uninitialized in this function [-Wuninitialized] 

出力にした

c is 0 

ことでこれが起こります時間cがI/Oシステムに渡され、その空間は一度はでしたlameness()のは他の変数に再利用されており、スペースに格納された66を傷つけています。実際、元のコードでも私のマシンで0が生成されます。

関連する問題