我們在代碼中使用Native COM支持。一切都很好,只是我們不喜歡錯誤_com_raise_error()被調用,拋出_com_error異常的事實。由於我們有自己的異常層次結構捕獲這個_com_error是不方便的 - 它不在我們的層次結構中,甚至不能從std :: exception繼承。誰擁有IErrorInfo的所有權?
所以我們需要重寫_com_raise_error()。它本身很簡單 - 只需在我們的代碼中定義它,鏈接器就會與它鏈接。
但是不清楚誰擁有IErrorInfo。簽名是
void __stdcall _com_raise_error(HRESULT hr, IErrorInfo* info);
所以無論誰調用該函數將負責函數返回後調用IErrorInfo :: Release()。但是如果我們拋出一個異常並且控制權會轉移到其他地方,那麼函數將如何返回呢?我們檢查了所謂的AddRef(),然後在進入該函數時立即釋放(),引用計數器爲1.稍後,我們將所有權傳遞給構造的異常對象 - 它在其構造函數中調用AddRef() )在析構函數中。我想這是不正確的,因爲AddRef()會將引用計數增加到2,但只有一個Release()將被調用(在異常析構函數中)。
我正確的說,構造函數中的AddRef()會導致內存泄漏,或者是否有一些內部機制不允許IErrorInfo對象泄漏?