2012-02-08 15 views
1

不要取消订阅COMObject事件可能导致内存泄漏,尽管我使用Marshal.FinalReleaseComObject?虽然我使用Marshal.FinalReleaseComObject,但是不要取消订阅COMObject事件会导致内存泄漏?

我已经定义在我的课的新成员是COMObject

protected COMObject.Call call_ = null; 

这个类有以下事件处理程序,我订阅了

call_.ActionA += new COMObject.AEventHandler(AEvent); 
call_.ActionB += new COMObject.BEventHandler(BEvent); 
call_.Destructed += new COMObject.DestructedEventHandler(CallDestructedEvent); 

当破坏事件被称为我做元帅。 FinalReleaseComObject

Marshal.FinalReleaseComObject(call_) 

但未取消订阅事件

call_.ActionA -= new COMObject.AEventHandler(AEvent); 
call_.ActionB -= new COMObject.BEventHandler(BEvent); 
call_.Destructed -= new COMObject.DestructedEventHandler(CallDestructedEvent); 

这是否会导致内存泄漏?或者GC会处理它? 您可以将您的答案链接到某些MSDN或文章吗?

谢谢!多尔。

+0

随机猜测内存泄漏的原因很少是正确的做事方式。有一些工具(一些免费的,一些是免费的)可以帮助您找到泄漏源。你会更好地发现和使用这些。 – 2012-02-08 13:22:20

+0

你能推荐一个吗?那可以处理COM和.Net? – 2012-02-08 13:25:40

+1

我开始使用“调试工具for Windows”(特别是ADPlus)来捕获内存转储(希望在出现OutOfMemoryException时或稍后使用一段时间)。然后可以使用WinDBG来探索内存转储。一个名为SOS的扩展可以被加载,然后允许你从.NET的角度来检查相同的转储。在尝试使用它们之前,我会去阅读这些内容(它们不适合那些微弱的人) – 2012-02-08 15:52:45

回答

1

您是否尝试在执行释放之前取消订阅它们,以查看它是否有助于内存泄漏? 你有一个破坏处理程序,你可以在那里做。

您是否曾经调用COM对象的任何属性,如果这样做,have you released them properly too? 我认为,即使您在父对象上调用FinalReleaseComObject,如果您还没有释放子对象,那么即使有没有提到父母可能仍然有参考悬挂的孩子。

+0

您能否提供链接以支持您的答案? – 2012-02-08 14:45:23

+0

除了我的原始答案中包含的链接,还有:http://mvdeveloper.blogspot.com/2012/02/marshalfinalreleasecomobject-fun.html但他们都没有专门解决内存泄漏问题。如果你反复运行这个相同的代码,并且COM对象不是单个实例,那么你将获得建立在内存中的COM对象的多个副本。 – Nanhydrin 2012-02-08 14:51:50

+0

另外,在你的事件处理程序中,如果你使用COM对象的任何属性,你需要确保你在处理程序中释放它们。 – Nanhydrin 2012-02-08 14:59:33