2016-02-04 78 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

這是我在想自己,但正如我指出我沒有做下了一陣++ COM的東西... –