2017-05-06 7 views
3

オブジェクト 'foo'への参照を格納するC++オブジェクト 'bar'があります。このオブジェクト 'foo'が破棄された場合:参照が無効になるのですか?ここでは例:C++リファレンスのライフサイクル

#include <iostream> 

struct Foo{ 
    int a = 5; 
}; 

class Bar{ 
    public: 
     Bar(const Foo &foo) : foo(foo){} 

     int getA() const{return foo.a;} 

    private: 
     const Foo &foo; 
}; 

int main(){ 
    Bar *bar; 
    { 
     Foo foo; 
     bar = new Bar(foo); 
    } //foo is destroyed. So, 'bar' contain an invalid ref to 'foo' ? 

    std::cout<<"A value: "<<bar->getA()<<std::endl; //is it correct to access to 'foo' ? 

    delete bar; 
    return 0; 
} 

プログラムが完全に実行され、Valgrindのは、すべてのエラーを検出しないようです。それが正しいか ?

+0

正しい用語は "ポインタ"です。 「参照」という用語には、C++での特定の技術的な意味がありますが、これはあなたの考え方とは異なります。 –

+2

@Kerrek何言ってるの? 'const Foo &foo;'は参考になります。 –

+0

@NeilButterworth: 'bar'はポインタです。私は、OPのステートメントに言及していました。 "barはオブジェクトfooへの参照を格納しています"。むしろ、 "barは、(無名の)Barオブジェクトのアドレスを格納しています(これは参照を保持しています)。実際に、私は、OPが考えていたもの以外のものを考えていたかもしれません。 –

答えて

1

C++での参照は、マネージメモリのような参照ではありません。 参照されたオブジェクトが死亡すると、参照は無効となり、手榴弾の動きが起こります。

関連する問題