[英]RefCount remains unchanged after AtlUnadvise call
我們發現由於RefCount在AtlUnadvise()之后沒有減少而導致的內存泄漏問題。
這是測試代碼:
void CCppTesterDlg::OnBnClickedTextbtn()
{
CComObject<CManagedGuiEventSinkImpl> *pEventSink;
TestForm::ITestFormPtr pTestFormPtr( __uuidof(TestForm::TestForm) );
//Attach our COM event sink to the managed dialog to listen for keyboard and mouse events
if( CComObject<CManagedGuiEventSinkImpl>::CreateInstance(&pEventSink) == S_OK )
{
HRESULT hr = S_FALSE;
DWORD dwCookie = 0;
CComPtr<ManagedGuiEventInterface::IManagedGuiEventSink> pSink( pEventSink ); // ref count == 1
hr = AtlAdvise( pTestFormPtr, pSink, __uuidof(ManagedGuiEventInterface::IManagedGuiEventSink), &dwCookie );
// ref count == 2
//pTestFormPtr->OpenDialog();
//Detach the event sink after the modal dialog has been closed
hr = AtlUnadvise( pTestFormPtr, __uuidof(ManagedGuiEventInterface::IManagedGuiEventSink), dwCookie );
// ref count == 2
}
}
CManagedGuiEventSinkImpl類用於從C#模塊獲取事件,到目前為止,它可以正常工作,但是我們發現上面的pEventSink對象未正確釋放。
我在那些課上錯過了什么嗎?
任何參考將不勝感激,在此先感謝。
您如何在托管接口的CCW上正確看到引用計數? pEventSink是一個CComObject對象,因此您可以在監視窗口中檢查引用計數,它不是托管對象。
我的朋友剛剛告訴我,在調用GC.Collect()之后,FinalRelease()將被命中,因此它由.net GC保留。
謝謝大家
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.