2013-10-22 94 views
0

來自IUnknown-> Release()文檔的引用: 「對呼叫者的註釋 當您不再需要使用接口指針時調用此方法如果您正在編寫一個接受輸入輸出參數的方法,調用你在傳入的指針之前釋放它,然後複製它的頂部值。「正在釋放IDispatch指針

1.在下面的代碼中調用pDocument-> Release()後,@ rc變量等於1。我應該爲pDocument調用Release兩次嗎?

2.在哪種情況下IDispatch的計數增加?

3.當我將它作爲指針傳遞給我的函數時,IDispatch的引用計數是否增加?

4.我有幾十個IDispatch *對象,那麼如果我忘記Release()其中的任何一個呢?內存泄漏?

5.是否有任何簡單的方法可以發佈所有IDispatch *或者我只能手動發佈它們?

AutoWrap(DISPATCH_METHOD, &result.GetVARIANT(), pDocuments, TEXT("Close"), 1, saveChanges.GetVARIANT()); 

AutoWrap(DISPATCH_METHOD, &result.GetVARIANT(), pWApp, TEXT("Quit"), 0); 

//Finalizing 
if (pWApp) 
{ 
    pWApp->Release(); 
    pWApp = NULL; 
} 
if (pDocuments) 
{ 
    ULONG rc = pDocuments->Release(); 
    pDocuments = NULL; 
} 
if (pActiveDocument) 
{ 
    pActiveDocument->Release(); 
    pActiveDocument = NULL; 
} 
+1

IUnknown :: Release()函數具有返回值是一個設計錯誤。有用於調試,但在代碼中使用時非常致命。**永遠不會調用Release(),它會在你不知道的其他代碼有引用的情況下產生硬性崩潰,並在你殺死該對象後嘗試使用它。只有當你獲得一個接口指針並且不想再使用它時才調用它。 –

+0

究竟是什麼意思「獲得一個接口指針?」來自哪裏?仍然沒有得到。 –

+0

從某個函數或方法返回一個作爲[out]參數 - 例如'IUnknown :: QueryInterface'或'CoCreateInstance'。這樣的函數總是在返回指針前加上'AddRef',而調用者負責在完成它時釋放它。 –

回答

2

1. @ RC變量等於1主叫pDocument-後>推出()在下面的代碼。我應該爲pDocument調用Release兩次嗎?

不,這意味着別人也擁有對這個對象的引用,如果你讓對象從它們下面自己刪除它們,它們將不會被逗樂。

2.在哪種情況下IDispatch的檢索次數增加了?

當您調用AddRef或其他任何接口指針指向同一個對象。

3.當我將它作爲指針傳遞給我的函數時,IDispatch的引用計數是否增加?

不,不是自動的。該函數當然是免費的,並且如果需要將指針存儲在某處,可以在函數返回後使用。

4.我有幾十個IDispatch *對象,那麼如果我忘記了Release()中的任何一個呢?內存泄漏?

是的。當你忘記freemalloc ed或deletenew ed或fclose時,會發生同樣的情況fopen ed。

5.是否有任何簡單的方法可以發佈所有IDispatch *或者我只能手動發佈它們?

看看智能指針, CComPtr_com_ptr_t

+0

謝謝你的回答。 5.「查看智能指針,例如CComPtr或_com_ptr_t」 - 如果沒有類型庫可以導入,並且使用了後期綁定,那麼它很有用。 –

+0

2.您能否提供「或指向同一對象的任何其他接口指針」的示例?仍然不清楚。 –

+0

@UnhandledException如果您的代碼中已經有IDispatch指針,那麼對它們使用智能指針是有用的,不需要更多的類型庫。 – manuell