近日在研究webkit的時候發現了一個函數
template<typename T> inline void deleteOwnedPtr(T* ptr) {typedef char known[sizeof(T) ? 1 : -1];if(sizeof(known))delete ptr; }
一開始對這個函數非常費解,為什么作者不直接
delete ptr;
?
通過上stackoverflow提問然后查閱了一些資料后終于得到結果:這是用來防范錯誤釋放incomplete type指針而導致的未知的行為。這樣做之后,釋放incomplete type指針將引發一個編譯錯誤,使可能的錯誤能夠及早發現。
原文是:If we delete a pointer and the object has incomplete type, we get undefined behavior. Instead this code causes compilation to fail if the object has incomplete type. The use of a negative number for the size of an array is a way to guarantee we get a compilation error.
?
那么什么是incomplete type呢?顧名思義,就是一個只有聲明沒有定義完成的類型,比如前向聲明。
舉個例子
class SomeType;void SomeFunction(SomeType* ptr) {deleteOwnedPtr(ptr); }
SomeType就是一個incomplete type,我們并不知道他的定義,如果我們企圖釋放該類型的指針,可能產生錯誤。
為了盡早避免出現這樣的錯誤,我們先判斷該指針指向的類型是否是incomplete type,然后人為引發一個編譯期錯誤。
所以當ptr指向imcomplete type時,sizeof(T)結果為零,這時語句變為
typedef char[-1] known; if (sizeof(known)) {... }
由于數組的大小不能為負,所以引發了編譯錯誤,我們就能及早的發現可能出現的問題。
?
參考鏈接
http://stackoverflow.com/questions/10897998/i-cant-understand-the-deleteownedptr-function-in-webkit