假設我們有一個指向com接口的指針,所以我的問題是我們需要在Release()調用之後將指針設置爲null。或者COM如何處理它?在調用COM Release()函數後指針應該設置爲null?
Func1()
{
.....
.....
pComInterface->Release();
pComInterface = NULL; //---> Does this required? If used, then what is the impact?
}
假設我們有一個指向com接口的指針,所以我的問題是我們需要在Release()調用之後將指針設置爲null。或者COM如何處理它?在調用COM Release()函數後指針應該設置爲null?
Func1()
{
.....
.....
pComInterface->Release();
pComInterface = NULL; //---> Does this required? If used, then what is the impact?
}
如果pComInterface
是原料指針一些COM接口,然後但從COM的角度最重要的事情就是打電話Release()
妥善管理對象的生命週期。 (COM不知道,如果你的原始指針設置爲NULL
與否後Release()
打電話。)
然而,從的良好的代碼質量點,你應該設置指針NULL
(或者,在調用Release()
之後,確保您沒有對以前發佈的COM對象的懸掛引用,如果您在Release()
之後有一些代碼,則在C++ 11中更好地調用nullptr
)。
(這是一個類似的情況new
和delete
:你必須new
後調用delete
正確釋放對象的資源,你不「需要」來設置指針nullptr
delete
後,但它是一個良好的編碼習慣,以避免叼着已刪除的對象的引用。)
此外,更妙的是使用智能指針管理的COM對象接口的一生,就像ATL::CComPtr
。通過這種方式,正確呼叫Release()
(和AddRef()
)會自動爲您製作。 (繼續與new
和delete
的比較,這是相同的建議,爲喜歡智能指針像shared_ptr
或unique_ptr
代替原所屬指針。)
很好的解釋.. thx Mr.C64 ../ – 2013-03-13 18:55:31
@RahulSundar:不客氣。 – 2013-03-14 10:30:27
我認爲pComInterface
是一個原始指針,聲明例如: -
IFoo* pComInterface
不,你不需要爲NULL它 - 它只是局部變量。然而,調用IUnknown::Release
是強制性的,因爲您通知對象釋放指針,並且對象可以安全地減少其內部引用計數器(如果有)。
如果它不是該函數的局部變量,那麼它是否需要?另外Release()不會將其設置爲null,不是嗎? – 2013-03-12 07:13:43
@RahulSundar'Release()'無法訪問用於接口指針的存儲。這是你的*。我更喜歡它是一個非問題,正確使用COM接口智能指針(其中有幾個,兩個來自微軟直接在comutil庫和ATL中)。 (和答案+1)。 – WhozCraig 2013-03-12 07:36:20
「本地」我的意思是更一般的「僅與您的代碼相關」。不,釋放不會自動將它設置爲NULL。 – 2013-03-12 07:36:54
如果您打算使用'pComInterface'調用'發行後() '那麼恕我直言你應該將其設置爲空。否則,就把它留下吧。 – 2013-03-12 07:08:56
@CaptainObvlious:如果在代碼維護週期中,在Release()調用之後添加了一些代碼,那麼如果指針未設置爲NULL或nullptr,則可能存在懸掛引用並且很難發現錯誤引用一個對象_after_'Release()'調用)。一般來說,我認爲最好的做法是使用像ATL :: CComPtr <>'這樣的智能指針類。 – 2013-03-12 12:12:14