2016-02-04 2 views
0

Это, скорее всего, базовый, но с тех пор я использовал это. Я видел примеры, как каждый из следующих действий:Какая правильная обработка релиза IErrorInfo

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() здесь? Это имеет значение; и если да, то почему?

+0

Они оба ошибаются. Этот тип «не скажите мне, что у меня ошибка с нулевой указателем», стиль кодирования широко распространен и не делает ничего, кроме создания отчетов об ошибках «он не работает». Вы не можете в конечном итоге найти ошибку во втором фрагменте. –

+0

@ HansPassant, возможно, эта неустановленная часть того, что беспокоило меня о первом примере, теперь, что было бы лучшим способом сделать это? –

+0

Просто удалите '&& pError' –

ответ

1

Первое использование верно, хотя в «более коде здесь» вы должны быть осторожны, чтобы не вызывать исключение.

Лучше использовать умный указатель вместо IErrorInfo *, который автоматически вызывается Release() при выходе из области видимости. Тогда ваш код не будет протекать в случае «большего количества кода здесь», бросающего исключение.

Второй неверен, потому что если pError является нулевым или неопределенным, то разыменование его вызывает неопределенное поведение.

+0

Это то, что я думал сам, но поскольку я указал, что я не делал C++ COM-материал какое-то время ... –