c++ - 哪个是 IErrorInfo 版本的正确处理

标签 c++ com visual-c++-6

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

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()。那么你的代码就不会在“more code here”抛出异常的情况下泄露。

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

关于c++ - 哪个是 IErrorInfo 版本的正确处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35209971/

相关文章:

c++ - 从 vector<BSTR> 获取指向 BSTR 的指针

c# - 如何将整数数组从经典 asp 传递到 c# COM 对象?

c++ - Visual C++6 MFC MapViewOfFile 返回错误代码 8

c++ - IDispatch 派生类的 ATL 模板

c++ - 将 `getopt_long` 与无法识别的长选项一起使用时出现段错误

c++ - Qt:获取标准光标像素图

c++ - 如何在 cppunit 中断言语句抛出 Excp1 或 Excp2 类型的异常?

debugging - 使用 Visual Studio 6.0 从 XP 远程调试 NT 应用程序

c - 带有 unsigned long long 和 sprintf 的 Visual C++ 6.0

c++ - std::reverse_copy "error: function call has aggregate value"