【问题标题】:How do I check if my object is properly disposed?如何检查我的对象是否正确处置?
【发布时间】:2010-02-02 16:24:48
【问题描述】:

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

假设我有一个 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();
    }
}

现在,我需要 Dispose 我要做的 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 是否被正确处置?

【问题讨论】:

  • 我的自发想法是“你为什么要克隆Pens.Black”?但它也许只是用来说明问题?
  • @Frederik:只是一种初始化“空”笔的方法。我也可以= new Pen(Color.Black); - 这样做是因为表明我的对象已经创建并且最终需要释放/释放内存。

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


【解决方案1】:

不要认为这是可能的;您可以做的最好的事情是获取分析器(例如ants profiler)并对其进行测量。如果您发现内存泄漏过多(通过分析器),则说明有问题。

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

【讨论】:

  • 如果不可能,ANTS是怎么做到的?
  • @Dan:我猜是通过分析 API:blong.com/Conferences/DCon2003/Internals/Profiling.htm
  • @280Z28:我的意思是反问——我很确定 ANTS 做到了这一点(通过 .NET API,不少于)意味着它是 i> 可能。也就是说,当像 ANTS 这样的东西已经存在时,我当然不会自己做。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我建议使用这个pattern,它包含一个析构函数以确保清理未处理的项目。这将捕获您没有调用“处理”的任何内容,并且是一个很好的故障保险。

    【讨论】:

    • 尤其是适用于发布版本:你不应该覆盖任何不直接持有非托管的对象的终结器i> 资源由于不必要的和显着的性能开销。非托管资源几乎应该始终保存在派生自 SafeHandle(或类似)的类中,以减少 GC 的负载。
    【解决方案4】:

    我相信 FxCop(独立提供或集成到 VS2005+ 的 Team System 版本中)会检测到这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-29
      • 1970-01-01
      • 1970-01-01
      • 2015-01-17
      相关资源
      最近更新 更多