0

为了修复可能的内存泄漏,这里是它背后的历史: 有一个 VB 6.0 或 VC 6.0 文本编辑器控件,我们也必须在 .NET 中使用它。因此,在该控件的组件中,我看到了对该文本编辑器的一些 Interop 引用,然后我们创建了一个 .NET 自定义控件,将该文本编辑器放入其中,并在需要它的项目中使用它。

所以在 Designer.cs 文件中,我仍然看到如下变量:

private AxTextEditorLib.AxTextEditor ctlTEEditor;

然后是这样的公共属性:

[Obsolete("This accessor method was added as a convenience for migrating to this component. Remove at earliest convenience.")]
[Browsable(false)]
public AxTextEditor TextEditor
{
    get
    {
        return ctlTEEditor;
    }
}

.NET 设计器本身已经为此生成了标准的 dispose 方法,如下所示:

protected override void Dispose(bool disposing)
{
    if (disposing && (components != null))
    {
        components.Dispose();
    }
    base.Dispose(disposing);
}

但这足够了吗?我需要更多的内存处理吗?我需要使用 Marshal.ReleaseObjects 或类似的东西吗?我需要手动释放事件处理程序吗?

在此处输入图像描述

4

2 回答 2

1

调用的有效性Dispose()始终取决于调用链中发生的情况Dispose。因此,在本例中,设计器代码正在调用Dispose已添加到components集合中的每个组件的方法。

要确定这是否有用,您需要查看components集合中有哪些组件,以及Dispose这些组件的方法是什么。

当然,如果您在代码的其他部分附加了事件处理程序,那么您应该确保它们作为Dispose.

对于您的包装组件,值得将其设置null为处置的一部分,但还要查看它是否具有自己的 Dispose 方法,或任何其他可能释放资源的方法。

于 2012-12-10T20:42:39.930 回答
1

如果 ctlTEEditor 尚未为 null,则将其设置为 null。还要检查这个控件的公共属性/方法,看看是否有暴露的方法来释放内存。

于 2012-12-10T20:43:27.747 回答