今天看到一段奇怪的代碼,它的主要流程是這樣的:函數
void set() { Test* p = nullptr; Test *a = new Test; *p = a; std::cout << p->getMember() << "\n"; }
第一感受這代碼確定是有問題的,應該是編譯不過至少應該會有warning,但事實證實這段代碼能夠編譯經過,並且也沒有warning。(雖然這段代碼確實是錯誤的)指針
類Test的定義大體以下:code
class Test { public: Test():member(0){}; Test(const Test* c) : member(c->member){}; int getMember() const { return member; } private: int member; };
*t=a這行代碼至關於調用構造函數Test(const Test *t),因此這段代碼能夠編譯經過。 可是運行的話會產生未定義的行爲(undefined behavior)。get
看來這種狀況只能靠經驗了。io
千萬不要解引用空指針,千萬不要解引用空指針,千萬不要解引用空指針。編譯