2016-03-01 56 views
0

我有一個簡單的類:訪問nullptr的可能性如何?

class B 
{ 
public: 
    int getData() { return 3; } 
}; 

然後,我初始化它的指針與nullptr:

B *foo{ nullptr }; 

,然後嘗試使用它自帶的驚喜:

int t = foo->getData(); 

現在t是3.如果沒有構建這個類,那可能怎麼樣?是否因爲getData()不使用「this」?這打破了我所有關於指針的知識。

這是預期的行爲?我在Visual Studio 2013中工作。

+1

它的工作原理是因爲'foo-> getData()'等同於'getData(foo);'而被調用者從不* dereferences *參數。請注意,即使它起作用,它在C++中也被歸類爲* undefined behavior *。 – Nawaz

+0

感謝所有的答案。在我看來,它不應該是未定義的行爲,它應該崩潰。從我的角度來看,這是安全問題。如果一個方法接收到一個指向類的指針並且這個指針是nullptr,我可以使用這個指針來調用一個方法。是的,我知道它不能保證它會起作用,但是在你的圖書館裏是一個漏洞。 – LeDYoM

+0

LeDYoM:「*在我看來,它不應該是未定義的行爲,它應該崩潰。」*請耐心使用該語言,閱讀C++的設計目標及其歷史。 – Nawaz

回答

2

這是預期的行爲嗎?

不,它是UB,任何事情都是可能的。

是因爲getData()不使用「this」嗎?

是的,它可能工作,因爲this將不會在特殊情況下使用,但沒有保證。

+2

預期的行爲與未定義的行爲並不相互排斥。這正是我期望的行爲。 –

1

這是未定義的行爲,您正在訪問nullptr的成員方法。沒有特定的行爲或結果會被定義。

儘管如此,給定的(cppreference):

關鍵字this是prvalue表達式,其值是對象,其上被調用的成員函數的地址。

由於thisNULL值沒有被解除引用 - 該部件的方法沒有虛擬和不訪問的任何this成員數據 - 它「似乎」工作。

3

它是undefined behavior,所以你真的應該很scared

它可能碰巧顯然做了一些事情(在您的C++實現上),因爲getData函數不是虛擬的,也不使用B的任何成員。所以生成的代碼不解引用空指針。