2017-05-06 263 views
3

我有一个C++对象'bar',它存储对象'foo'的引用。如果这个对象'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的陈述,即“酒吧存储对象foo的引用”。相反,“bar存储一个(未命名的)Bar对象的地址(它反过来就是一个引用)”的确,我可能一直在想OP以外的东西。 –

回答

1

C++中的引用不像托管内存语言中的引用。 当引用的对象死亡时,引用无效,并具有潜在的手榴弹行为。