webkit中对incomplete type指针的处理技巧
近日在研究webkit的時(shí)候發(fā)現(xiàn)了一個函數(shù)
template<typename T> inline void deleteOwnedPtr(T* ptr) {typedef char known[sizeof(T) ? 1 : -1];if(sizeof(known))delete ptr; }一開始對這個函數(shù)非常費(fèi)解,為什么作者不直接
delete ptr;?
通過上stackoverflow提問然后查閱了一些資料后終于得到結(jié)果:這是用來防范錯誤釋放incomplete type指針而導(dǎo)致的未知的行為。這樣做之后,釋放incomplete type指針將引發(fā)一個編譯錯誤,使可能的錯誤能夠及早發(fā)現(xiàn)。
原文是: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,我們并不知道他的定義,如果我們企圖釋放該類型的指針,可能產(chǎn)生錯誤。
為了盡早避免出現(xiàn)這樣的錯誤,我們先判斷該指針指向的類型是否是incomplete type,然后人為引發(fā)一個編譯期錯誤。
所以當(dāng)ptr指向imcomplete type時(shí),sizeof(T)結(jié)果為零,這時(shí)語句變?yōu)?/p> typedef char[-1] known; if (sizeof(known)) {... }
由于數(shù)組的大小不能為負(fù),所以引發(fā)了編譯錯誤,我們就能及早的發(fā)現(xiàn)可能出現(xiàn)的問題。
?
參考鏈接
http://stackoverflow.com/questions/10897998/i-cant-understand-the-deleteownedptr-function-in-webkit
轉(zhuǎn)載于:https://www.cnblogs.com/Jiajun/archive/2012/11/15/2772072.html
總結(jié)
以上是生活随笔為你收集整理的webkit中对incomplete type指针的处理技巧的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MapServer应用开发平台示例
- 下一篇: 梦到怀孕掉头发怎么回事