簡體   English   中英

AtlUnadvise調用后,RefCount保持不變

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM