c++ - 谁取得 IErrorInfo 的所有权?

标签 c++ exception visual-c++ com

我们在我们的代码中大量使用原生 COM 支持。一切都很好,除了我们不喜欢在错误时调用 _com_raise_error() 并抛出 _com_error 异常这一事实。由于我们有自己的异常层次结构,因此捕获此 _com_error 很不方便 - 它不在我们的层次结构中,甚至不从 std::exception 继承。

因此我们需要覆盖 _com_raise_error()。它本身很简单 - 只需在我们的代码中定义它,链接器就会链接它。

但是尚不清楚谁拥有 IErrorInfo。签名是

void __stdcall _com_raise_error( HRESULT hr, IErrorInfo* info );

因此调用该函数的人将负责在函数返回后调用 IErrorInfo::Release()。但是,如果我们在函数中抛出异常并且控制权转移到其他地方,函数将如何返回呢?

我检查过 - 调用 AddRef(),然后在进入该函数后立即调用 Release() - 引用计数器为 1。稍后我们将所有权传递给构造的异常对象 - 它在其构造函数中调用 AddRef() 并调用 Release()在析构函数中。我想这是不正确的,因为 AddRef() 会将引用计数增加到 2,但随后只会调用一个 Release()(在异常析构函数中)。

我是否正确认为构造函数中的 AddRef() 会导致内存泄漏,或者是否存在某种根本不允许 IErrorInfo 对象泄漏的内部机制?

最佳答案

_com_raise_error() 并不意味着返回。无论其类型如何,它都必须引发异常。如果您查看 _com_raise_error() 的默认实现,引发的 _com_error 对象将拥有指定的 IErrorInfo 对象。 _com_error 的构造函数有一个默认值为 false 的 fAddRef 参数,因此不会调用 AddRef()。当 _com_error 对象被捕获它的任何异常处理程序破坏时调用 Release(),从而释放 IErrorInfo 对象。

关于c++ - 谁取得 IErrorInfo 的所有权?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1198829/

相关文章:

visual-c++ - 如何解决 VS 2013 中的 'Null' is null or not an object 错误

c++ - 将指向方法的指针从派生类转换为基类的最佳方法

c++ - 如何强制中断方法的执行

apache - HTACCESS - 大写到小写,异常(exception)

c# - 未找到自定义 Visual C++ CRL 程序集

visual-studio-2010 - 为什么在VS2010中创建C++/CLR项目时,在AssemblyInfo中默认添加了SecurityAction.RequestMinimum?

visual-c++ - 两个类对​​象之间的 Visual C++/CLI 相互访问?

c++ - 返回语句与接受指针写入

C++重载构造函数问题

c++ - Fortran 77 转换为 C++