首先,我知道調用空指針的方法是未定義的行爲。我也知道,因爲這不應該發生,編譯器可以(並且確實)假設this
始終爲非空。安全地檢查'this`是否爲空
但是在實際的代碼中,你有時會意外地做它。通常,它沒有不良影響,但當然this
在方法中爲null,並且可能會崩潰。
作爲一種調試手段,本着碰撞早期的精神,我把assert(this != 0)
放在一個方法中,我偶爾在空前的指針上調用過空指針。它似乎工作,但鐺與抱怨:
warning: 'this' pointer cannot be null in well-defined C++ code; comparison may be
assumed to always evaluate to true [-Wtautological-undefined-compare]
assert (this ! = 0);
^~~~ ~
我不知道最好的(至少不正確的)的方法是檢測this
是空的。一個簡單的比較可以優化出來。
- 我可以在
this
上做一些指針運算來試圖欺騙編譯器,或者強制它把指針當作一個整數。 - 我可以使用
memcmp
。 - 也許有編譯器特定的擴展來說「不要優化這個表達式」?
另外一個值得關注的是,在繼承的情況下,「空」這個指針實際上可能是類似0x00000004
,所以這將是很好也處理這種情況。我對Clang,MSVC或GCC的解決方案感興趣。
「輔助調試,並在碰撞早期的精神,」你應該現在支持GCC和鐺各種'-fsanitize'選項編譯。你應該在你的'assert'之後得到你想要的結果,而不需要修改你的代碼。這並不回答你的實際問題,但我懷疑你的實際問題沒有答案。 – hvd
C++中檢查指針是否爲空的標準方法是myptr == nullptr;我不知道這是否與NULL或0不同,但無論如何這是一個常見的檢查,就像在動態轉換後查看它是否成功之後,所以我沒有看到編譯器應該優化它,因爲它是一個非常重要的檢查。 – Zebrafish
@TitoneMaurice當編譯器可以在編譯時證明比較永遠不會是真的時,編譯器可以優化與'nullptr'的比較。這正是編譯器真正做的。 – hvd