假設下面的代碼:是否有可能從引用中產生分段錯誤?
Foo & foo = getFoo();
foo.attr; // 100% safe access?
如果foo
是一個指針,我會檢查它是否是NULL
,但是因爲它是一個參考,這樣的檢查是不必要的。我想知道的是,如果可能搞砸一個對象的引用,使得訪問它的屬性不安全。
我嘗試了一些例子,比如試圖將NULL
轉換爲Foo
對象,但是出現了編譯錯誤。我只是想確定上面的代碼總是安全的,並且我不應該知道內在的黑魔法。
從Benjamin的回答,我可以做一個示例代碼,我從中得到segmentation fault引用,因此它回答了我的問題。我會粘貼我的代碼,以防有人對未來感興趣:
#include <iostream>
using namespace std;
class B
{
public:
int x;
B() {x = 5;}
};
class A
{
public:
void f()
{
b = *(B*)NULL;
}
B & getB()
{
return b;
}
B b;
};
int main()
{
A a;
a.f();
cout << a.getB().x << endl;
return 0;
}
顯示的'getFoo'功能,以便更好地回答你的問題。 –
在我真正的問題中,'getFoo'有數百行代碼,它返回的對象可能會被數百個線程修改...因此,不可能以'getFoo'爲例。 – Kira
@Kira:請注意,您的段錯誤幾乎肯定來自'f()'函數中的語句'b = *(B *)NULL;'。不是來自'main'中的'a.getB()。x'。 –