哪个是 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 或不确定,则取消引用它会导致未定义的行为。
这可能是基本功能,但我已经有很长时间没有使用它了。我见过如下每个示例:
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 或不确定,则取消引用它会导致未定义的行为。