[英]Virtual destructor missing for base class in polymorphism = Ressource leak?
[英]Missing virtual destructor in base interface class?
我有一個來自IUnknown的類派生( public
),其定義(來自MinGW 4.9.2中的文件include/unknwnbase.h
)我粘貼如下:
extern "C++" {
MIDL_INTERFACE("00000000-0000-0000-C000-000000000046")
IUnknown {
public:
BEGIN_INTERFACE
virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject) = 0;
virtual ULONG STDMETHODCALLTYPE AddRef(void) = 0;
virtual ULONG STDMETHODCALLTYPE Release(void) = 0;
template<class Q>
HRESULT STDMETHODCALLTYPE QueryInterface(Q **pp) {
return QueryInterface(__uuidof(Q), (void **)pp);
}
END_INTERFACE
};
}
當我編譯派生類時,我得到以下警告(在OpenCV項目中將其視為錯誤):
基類'struct IUnknown'具有可訪問的非虛析構函數[-Werror = non-virtual-dtor]
我很難理解這是否是MinGW(缺少虛擬析構函數)的錯誤或其他可能以IUnknown派生的方式被規避的錯誤。 OpenCV項目是在其他幾個沒有彈出警告的環境中構建的......
在COM的上下文中,通過引用計數使用 IUnknown
的AddRef()
和Release()
方法進行對象的生命周期管理(以及相關的清理)。
每個COM對象都有一個與之關聯的引用計數。 當對象的引用計數達到0(例如,在某個COM接口指針上對象的多個客戶端正確調用了Release()
),該對象將被銷毀。 換句話說,COM對象不會以通常的C ++方式銷毀,例如在基類指針上調用delete
(因此在基類中需要適當的virtual
析構函數)。
(事實上,你不能只調用new
來分配一個COM對象。需要更多的COM機制。)
換句話說,當你完成一個COM接口指針時,你只需要調用它上面的Release()
。 因此,不需要在“基類”中定義虛擬析構函數,例如IUknown
接口或其他COM接口。
因此,我懷疑警告是MinGW工具鏈中的某個錯誤。
您不應該在您引用的Windows SDK頭文件中修改IUnknown
的定義, 也不應該在您可能為您的目的定義的自定義COM接口中添加虛擬析構函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.