如何检查我的物体是否妥善处理?

时间:2010-02-02 16:24:49

标签: .net visual-studio memory-management dispose

我想知道是否有一个“技巧”允许知道代码部分中的已使用对象是否已正确(完全)处理,或者换句话说,不会造成内存泄漏。

假设我有一个GDI对象的容器(或者我需要明确处理的其他对象)

public class SuperPen 
{
    Pen _flatPen, _2DPen, _3DPen;
    public SuperPen() 
    {
        _flatPen = (Pen)Pens.Black.Clone();
        _2DPen = (Pen)Pens.Black.Clone();
        _3DPen = (Pen)Pens.Black.Clone();
    }
}

现在,因为我需要处理GDI对象:

public class SuperPen : IDisposable
{
    Pen _flatPen, _2DPen, _3DPen;
    public SuperPen()
    {
        _flatPen = (Pen)Pens.Black.Clone();
        _2DPen = (Pen)Pens.Black.Clone();
        _3DPen = (Pen)Pens.Black.Clone();
    }

    public void Dispose()
    {
        if (_flatPen != null) { _flatPen.Dispose(); _flatPen = null; }
        // HERE a copy paste 'forget', should be _2DPen instead
        if (_flatPen != null) { _flatPen.Dispose(); _flatPen = null; }
        if (_3DPen != null) { _3DPen.Dispose(); _3DPen = null; }
    }
}

如果你添加一个新的“一次性”物品并忘记丢弃它,可能会发生这种情况。我怎么能检测到我的错误,我的意思是,检查我的SuperPen是否妥善处理?

4 个答案:

答案 0 :(得分:2)

不要认为这是可能的;您可以做的最好的事情是获取一个分析器(例如ants profiler)并进行测量。如果您发现过度泄漏内存(通过分析器),那么就会出现问题。

除了使用分析器之外,我不确定是否有任何自动技术可以帮助您识别不可用的资源。

答案 1 :(得分:1)

MemProfilerANTS Memory Profiler等工具会识别内存泄漏(两者都有试用版)。

答案 2 :(得分:0)

我建议使用这个pattern,它包含一个析构函数,以确保清理未处理的项目。这将抓住你没有称之为“处置”的任何东西,并且是一个很好的故障安全。

答案 3 :(得分:0)

我相信FxCop(可单独使用或集成到VS2005 +的Team System版本中)将检测到这一点。