哪个是 IErrorInfo 版本的正确处理

Which is proper handling of IErrorInfo release

这可能是基本功能,但我已经有很长时间没有使用它了。我见过如下每个示例:

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() 的正确方法?有关系吗;如果是,为什么?

第一个用法是正确的,虽然在"more code here"中你必须小心不要抛出异常。

最好使用智能指针而不是IErrorInfo *,它会在超出范围时自动调用Release()。那么你的代码就不会在 "more code here" 抛出异常的情况下泄漏。

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