【发布时间】:2012-11-16 15:19:06
【问题描述】:
我的班级正在使用 COM 资源,并且我从 IDisposable 继承了它。为了清理非托管资源,我有调用 Marshall.ReleaseCOMObject() 方法的 Dispose() 方法......所以我的问题是我们还需要 Destructor 方法(Finalizer)吗?释放COM资源?当我确实有 finalzier 方法并在其中调用 Marshal 或 Dispose 时,我会收到一个 RCW 错误,当我删除 finalizer 方法时,我不会再收到 RCW 错误但是如果我查看内存分析器,我可以看到非托管资源每次打开包含此 COM 资源的表单时,内存都会不断增加...所以看起来它没有清理它?那么在 C# 应用程序中清理 COM 资源的正确方法是什么?
我将使用我很快拥有的一些代码示例来更新问题。
谢谢。
private MyCOMobject theCOMobject = null;
static SuppressFieldCntrlr()
{
new SomeCalss();
}
private bool disposed = false;
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
//nothing in here, is it just for Managed Resources?
}
Marshal.ReleaseComObject(this);
MethodFoo(false);
disposed = true;
}
}
【问题讨论】:
-
只是想补充一点:如果你在你的类中添加终结器,你的类会自动处理一些不同的东西。 gc 的第一波,你的对象不是直接收集的,而是放在终结器队列中的。在下一次运行中,将被调用并收集。但是当然,这只发生在你的对象不再被任何引用持有的情况下,否则你可能只是有一个普通的内存泄漏,我猜这是你的问题。
-
@dowhilefor :有趣的信息。我不知道排队。普通的内存泄漏听起来是对的。您能否详细说明如何修复和找到它?这是关于此的原始问题,尚未回答:stackoverflow.com/questions/13609098/… 谢谢
-
嗯,我最好的建议是:使用内存分析器来查找泄漏 :) 如果更喜欢 redgates 蚂蚁内存分析器,但我敢肯定那里有很多。一些调查建议:请记住,事件包含硬引用。检查你是否真的使用单例,检查所有在某一时刻持有引用并且比你的泄漏类寿命更长的对象。
-
@dowhilefor : 是的,我有 redgate...而且类构造函数是 STATIC...所以它只被调用一次...Smelly?
标签: c# winforms memory idisposable