2012-02-28 68 views
0

項目的一些課程我工作的這個樣子的智能指針釋放FinalRelease明確

class ATLCOMCLASS<CComObjectRootEx<ATLCOMCLASS> > 
{ 
    ISomeInterfacePtr p; 
    /*some stuff*/ 
    void FinalRelease() 
    { 
    p = NULL; 
    } 
} 

ISomeInterfacePtr_COM_SMARTPTR_TYPEDEF定義。我不明白爲什麼它需要明確做p = NULL這意味着p->Release(),如果這項操作將自動進行ATLCOMCLASS dtor。

請問您可以請我嗎?

回答

1

從技術上講,它不具有在代碼中,或在任何時候明確這一點上做的p = NULL,因爲析構函數將釋放智能指針正如你指出。但是,明確發佈它可以更好地控制發生時的情況,這可能是有用的。

根據ISomeInterface的要求,在this被銷燬之前釋放p的程序和其他因素可以滿足某些程序條件。特別是,如果FinalRelease()被其他方法調用,並且不是,那麼清理正在其他地方發生,並且可能具有非常不同的觸發。也可以清理它,然後通過某種重置或其他任何順序重新創建一些資源。

爲了弄清楚爲什麼這很有用,假設它不是一個錯誤,你需要回到可能的程序流程,看看發生了什麼。