2012-02-16 76 views

回答

10

只要FinalRelease有問題,我假設你的問題與ATL有關。

在大多數情況下,你可以在兩者中的任何一箇中清理。將在實際析構函數之前立即調用FinalRelease。最重要的區別是,如果聚合其他對象,則FinalRelease會爲您提供在頂級COM對象類(尤其是CComObject)的實際析構函數開始工作之前清除引用並釋放依賴關係的機會。

也就是說,您分兩步清理,首先引用FinalRelease中的聚合對象,然後引用FinalRelease或析構函數中的其他東西。

1

這是一般的方法:

MyComClass::~MyComClass() 
{ 
    // Cleanup object resources in here. 
} 

ULONG __stdcall MyComClass::Release() 
{ 
    ref_count_--; 

    if (0 == ref_count_) 
    { 
     delete this; 
     return 0; 
    } 

    return ref_count_; 
} 

編輯:FinalRelease()似乎與ATL對此我不熟悉。

+0

比你。 ATL嚮導沒有在我的類中添加':: Release()'方法,但大概這個引用計數是在某個地方進行的?我怎麼找到它? – 2012-02-16 16:03:49

+1

@SideshowBob,抱歉,我從來沒有使用ATL嚮導,所以我不能評論它的作用。鑑於他的回答,Roman R.似乎很熟悉它。 – hmjd 2012-02-16 16:08:47

+1

ATL通常使用'new CComObject ',它繼承自'T'並在大多數派生類中添加了'AddRef'和'Release'的實現 - 這樣,'delete this''正確地與非虛擬析構函數。 – 2012-02-16 16:22:37