2015-05-02 60 views
3

使用COM您可以使用CoCreateInstance創建一個對象。CoCreateInstance - 什麼是相反的?

是否有一種方法可以完全摧毀它,因此單元測試的下一部分可以重新開始?

+2

您是否在尋找[IUnknown :: Release()](https://msdn.microsoft.com/en-us/library/windows/desktop/ms682317.aspx)? –

+0

但是如何保證析構函數被調用來執行呢? –

+0

另請參見:[你知道你的析構函數何時運行嗎?第1部分](http://blogs.msdn.com/b/oldnewthing/archive/2004/05/20/135841.aspx),[第2部分](http://blogs.msdn.com/b/oldnewthing/存檔/ 2004/05/21/136701.aspx)。 –

回答

6

每個人都持有一個引用的COM接口指針可以保證對象是活着的,因此如果不知道每個人都持有指向COM對象的接口指針,並且能夠請求釋放,則無法確保該對象被銷燬。

你當然可以嘗試

for(; ;) 
{ 
    if(pFoo->Release() == 0) 
    break; 
} 

然而,即使這樣,你(一)可以得到死循環,(B)的引用你的對象將獲得訪問衝突/不確定的行爲,一旦他們嘗試訪問銷燬的對象(他們仍然期望被引用的對象是活着的)。

另一種方法是使用包裝器對象並在內部管理實際的COM對象而不公開它。你將方法調用從包裝器轉發到內部對象。然後你可以要求你的包裝釋放內部引用,這通常會導致內部對象的破壞。

+0

如何找出在VS 2010中保留COM對象的東西? –

+2

有沒有辦法,這部分是輕量級的。 COM對象沒有看到/知道誰正在使用它。它只管理參考計數器,以便它知道何時不再使用,是時候自我毀滅。 –

+0

SO調試很困難。正如我想創建(setUp)和銷燬(tearDown)對象進行測試,但不知道他們爲什麼不調用析構函數。並找出誰不打球的提示? –