0
下面的代碼是否安全?這會引起它在超出範圍之後指向什麼也不指向?
class B {
public:
int& b;
B (int& _b) :
b(_b) {}
};
B* foo() {
int a;
return new B(a);
}
由foo返回的對象中的引用指向什麼都不指向(因爲int a超出了範圍)還是編譯數字出來了?
下面的代碼是否安全?這會引起它在超出範圍之後指向什麼也不指向?
class B {
public:
int& b;
B (int& _b) :
b(_b) {}
};
B* foo() {
int a;
return new B(a);
}
由foo返回的對象中的引用指向什麼都不指向(因爲int a超出了範圍)還是編譯數字出來了?
編譯器可能會發出警告,但新創建的對象肯定包含一個懸掛的無效引用,因爲對象a
在foo
範圍的末尾停止存在。
'B :: b'將會是一個懸掛引用,因爲當你已經聲明'foo()'返回時,局部變量'a'不再存在。 – hmjd
請參閱17.6.4.3.2/2:*以下劃線開頭的每個名稱都保留給實現,以用作全局名稱空間中的名稱*。改用'b_'。 – dirkgently
@dirkgently,那個名字不在全局名字空間中,名字沒有問題 –