我们在代码中使用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对象泄漏?