2012-12-10 35 views
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或类似的东西?我是否需要手动释放事件处理程序?

enter image description here

回答

1

调用Dispose()的有效性常是依赖于在Dispose调用链会发生什么。因此,在这种情况下,Designer代码正在调用已添加到components集合中的每个组件的Dispose方法。

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

当然,如果你在代码的其他部分附加了事件处理程序,那么你应该确保它们被解除挂钩作为Dispose的一部分。

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

1

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