gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:12:59 27 4
gpt4 key购买 nike

我们在我们的代码中大量使用原生 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com