2012-06-15 28 views
0

下面的代碼是否安全?這會引起它在超出範圍之後指向什麼也不指向?

class B { 
    public: 
    int& b; 
    B (int& _b) : 
     b(_b) {} 
}; 

B* foo() { 
    int a; 
    return new B(a); 
} 

由foo返回的對象中的引用指向什麼都不指向(因爲int a超出了範圍)還是編譯數字出來了?

+6

'B :: b'將會是一個懸掛引用,因爲當你已經聲明'foo()'返回時,局部變量'a'不再存在。 – hmjd

+0

請參閱17.6.4.3.2/2:*以下劃線開頭的每個名稱都保留給實現,以用作全局名稱空間中的名稱*。改用'b_'。 – dirkgently

+1

@dirkgently,那個名字不在全局名字空間中,名字沒有問題 –

回答

5

編譯器可能會發出警告,但新創建的對象肯定包含一個懸掛的無效引用,因爲對象afoo範圍的末尾停止存在。