我碰到下面的代碼近日傳出:合法/定義明確的C++調用不通過空指針訪問成員的非靜態方法嗎?
class Foo
{
public:
void bar();
// .. other stuff
};
void Foo::bar()
{
if(!this) {
// .. do some stuff without accessing any data members
return;
}
// .. do normal actions using data members
}
代碼編譯,因爲在C++方法只是被隱式傳遞一個指針「這個」和「這個」可以被檢查爲NULL,就像任何功能其他指針。很明顯,這段代碼雖然沒有崩潰,但是它很混亂,而且很糟糕。在調試器中遍歷代碼會非常困難,看到一個NULL指針即將調用一個方法,然後看不到預期的崩潰。我的問題是:是否違反C++標準調用SomeFooPtr->bar()
其中SomeFooPtr == NULL
?
它發生在我身上,它可能不會因爲用戶定義的操作符 - >返回一個指針,這意味着即使該指針爲NULL,它肯定沒有被解除引用(取消引用一個NULL指針,我相信是被視爲由標準規定爲非法或未定義)。另一方面,原始指針的語義不一定必須與用戶定義的指針的語義相匹配 - 即使編譯器不會生成一個指針,操作符也可能被視爲解引用。
Duplicate:http://stackoverflow.com/questions/2474018/when-does-invoking-a-member-function-on-a-null-instance-result-in-undefined-behav – GManNickG 2010-07-15 17:23:30