4
A
回答
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對此我不熟悉。
相關問題
- 1. 執行析構函數/處理代碼
- 2. C++析構函數代碼
- 3. ATL結構破壞了DLL的COM對象
- 4. gc-lua對象上的析構函數
- 5. Excel VBA對象構造函數和析構函數
- 6. 處置敲定和析構函數
- 7. COM對象的非默認構造函數
- 8. 我應該如何釋放Delphi 7析構函數中的對象數組?
- 9. 指向對象及其析構函數
- 10. ATL的CAccessToken的析構函數實際上做了什麼?
- 11. MFC COM或ATL COM(ActiveX)
- 12. 重構和代碼放置
- 13. 基於ATL的COM對象/ Metro風格應用
- 14. COM與ATL版本
- 15. 何處放置動畫代碼?
- 16. 將分析對象傳遞到雲代碼函數
- 17. Symfony 2:處理COM對象
- 18. 清理C++異常的析構函數中的代碼
- 19. 怪異崩潰調試COM對象的析構時
- 20. javascript的ATL COM事件
- 21. 代碼工作,但在析構函數崩潰(沒有複製構造函數)
- 22. 使用ATL枚舉COM對象(IDispatch)方法?
- 23. 從另一個COM對象中獲取COM對象
- 24. C++析構函數與類對象的std :: vector的問題
- 25. 如何使用JavaScript處理COM對象?
- 26. COM對象的動態數組
- 27. 實現在生成的C代碼析構函數
- 28. 安全放置新的和明確的析構函數調用
- 29. 何處放置格式函數
- 30. 使用自定義分配器調用對象構造函數/析構函數
比你。 ATL嚮導沒有在我的類中添加':: Release()'方法,但大概這個引用計數是在某個地方進行的?我怎麼找到它? – 2012-02-16 16:03:49
@SideshowBob,抱歉,我從來沒有使用ATL嚮導,所以我不能評論它的作用。鑑於他的回答,Roman R.似乎很熟悉它。 – hmjd 2012-02-16 16:08:47
ATL通常使用'new CComObject',它繼承自'T'並在大多數派生類中添加了'AddRef'和'Release'的實現 - 這樣,'delete this''正確地與非虛擬析構函數。 –
2012-02-16 16:22:37