这是对IErrorInfo发布的正确处理

Which is proper handling of IErrorInfo release

本文关键字:正确处理 IErrorInfo      更新时间:2023-10-16

这可能是基本的,但我已经很久没有使用它了。 我看过下面每个例子:

IErrorInfo *pError;
HRESULT hrError = ::GetErrorInfo(NULL, &pError);
//more code here            
if (SUCCEEDED(hrError) && pError) {
    //more code here            
    pError->Release();
}

然后在其他地方

IErrorInfo *pError;
HRESULT hrError = ::GetErrorInfo(NULL, &pError);
//more code here            
if (SUCCEEDED(hrError) && pError) {
    //more code here            
}
pError->Release();

以下哪项是在此处使用Release()的正确方法? 有关系吗?如果是这样,为什么?

第一种用法是正确的,尽管在"此处的更多代码"中,您必须小心不要引发异常。

最好

使用智能指针而不是 IErrorInfo * ,当超出范围时,它会自动调用Release()。然后,在"此处有更多代码"引发异常的情况下,您的代码不会泄漏。

第二个是错误的,因为如果pError为空或不确定,那么取消引用它会导致未定义的行为。