【问题标题】:RefCount remains unchanged after AtlUnadvise callAtlUnadvise 调用后 RefCount 保持不变
【发布时间】:2012-04-27 04:37:32
【问题描述】:

我们发现内存泄漏问题是由于在 AtlUnadvise() 之后 RefCount 没有递减。

这里是测试代码:

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 对象没有正确释放。

我在这些课程中有什么遗漏的吗?

任何参考将不胜感激,在此先感谢。

【问题讨论】:

标签: c# c++ events com


【解决方案1】:

您如何查看托管接口 CCW 上的引用计数? pEventSink 是一个 CComObject 对象,因此您可以在监视窗口中检查 ref 计数,它不是托管对象。

我的朋友刚刚向我展示了 FinalRelease() 将在 GC.Collect() 被调用后被命中,所以它被 .net GC 持有。

谢谢大家。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-29
    • 2019-05-16
    • 2021-12-31
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    • 2014-01-16
    相关资源
    最近更新 更多