【发布时间】:2009-07-29 08:44:01
【问题描述】:
我们在代码中随意使用 Native 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 对象泄漏?
【问题讨论】:
标签: c++ exception visual-c++ com