2013-03-12 84 views
4

假設我們有一個指向com接口的指針,所以我的問題是我們需要在Release()調用之後將指針設置爲null。或者COM如何處理它?在調用COM Release()函數後指針應該設置爲null?

Func1() 
{ 
..... 
..... 
pComInterface->Release(); 
pComInterface = NULL; //---> Does this required? If used, then what is the impact? 
} 
+0

如果您打算使用'pComInterface'調用'發行後() '那麼恕我直言你應該將其設置爲空。否則,就把它留下吧。 – 2013-03-12 07:08:56

+0

@CaptainObvlious:如果在代碼維護週期中,在Release()調用之後添加了一些代碼,那麼如果指針未設置爲NULL或nullptr,則可能存在懸掛引用並且很難發現錯誤引用一個對象_after_'Release()'調用)。一般來說,我認爲最好的做法是使用像ATL :: CComPtr <>'這樣的智能指針類。 – 2013-03-12 12:12:14

回答

3

如果pComInterface原料指針一些COM接口,然後但從COM的角度最重要的事情就是打電話Release()妥善管理對象的生命週期。 (COM不知道,如果你的原始指針設置爲NULL與否後Release()打電話。)

然而,從的良好的代碼質量點,你應該設置指針NULL(或者,在調用Release()之後,確保您沒有對以前發佈的COM對象的懸掛引用,如果您在Release()之後有一些代碼,則在C++ 11中更好地調用nullptr)。

(這是一個類似的情況newdelete:你必須new後調用delete正確釋放對象的資源,你不「需要」來設置指針nullptrdelete後,但它是一個良好的編碼習慣,以避免叼着已刪除的對象的引用。)

此外,更妙的是使用智能指針管理的COM對象接口的一生,就像ATL::CComPtr。通過這種方式,正確呼叫Release()(和AddRef())會自動爲您製作。 (繼續與newdelete的比較,這是相同的建議,爲喜歡智能指針shared_ptrunique_ptr代替原所屬指針。)

+0

很好的解釋.. thx Mr.C64 ../ – 2013-03-13 18:55:31

+0

@RahulSundar:不客氣。 – 2013-03-14 10:30:27

6

我認爲pComInterface是一個原始指針,聲明例如: -

IFoo* pComInterface

不,你不需要爲NULL它 - 它只是局部變量。然而,調用IUnknown::Release是強制性的,因爲您通知對象釋放指針,並且對象可以安全地減少其內部引用計數器(如果有)。

+0

如果它不是該函數的局部變量,那麼它是否需要?另外Release()不會將其設置爲null,不是嗎? – 2013-03-12 07:13:43

+0

@RahulSundar'Release()'無法訪問用於接口指針的存儲。這是你的*。我更喜歡它是一個非問題,正確使用COM接口智能指針(其中有幾個,兩個來自微軟直接在comutil庫和ATL中)。 (和答案+1)。 – WhozCraig 2013-03-12 07:36:20

+0

「本地」我的意思是更一般的「僅與您的代碼相關」。不,釋放不會自動將它設置爲NULL。 – 2013-03-12 07:36:54