AtlUnadvise 调用后 RefCount 保持不变
Posted
技术标签:
【中文标题】AtlUnadvise 调用后 RefCount 保持不变【英文标题】:RefCount remains unchanged after AtlUnadvise call 【发布时间】: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 对象没有正确释放。
我在这些课程中有什么遗漏的吗?
任何参考将不胜感激,在此先感谢。
【问题讨论】:
resources.esri.com/help/9.3/arcgisdesktop/com/com/vcpp/… - 请参阅标题下的 Event Circular Reference Issues Erm,您如何查看托管接口的 CCW 上的引用计数?这深埋在 CLR 中。 【参考方案1】:您如何查看托管接口 CCW 上的引用计数? pEventSink 是一个 CComObject 对象,因此您可以在监视窗口中检查 ref 计数,它不是托管对象。
我的朋友刚刚向我展示了 FinalRelease() 将在 GC.Collect() 被调用后被命中,所以它被 .net GC 持有。
谢谢大家。
【讨论】:
以上是关于AtlUnadvise 调用后 RefCount 保持不变的主要内容,如果未能解决你的问题,请参考以下文章
为啥 foreach 将 refcount 增加 2 而不是 1?
[gstreamer] 关于GstBuffer的refcount
[RxJS] RefCount: automatically starting and stopping an execution
使用 Tcl C API 的 Lib 可能由于错误的 refCount 使用而崩溃