.net 我如何检查我的物品是否正确处置?

.net 我如何检查我的物品是否正确处置?,.net,visual-studio,memory-management,dispose,.net,Visual Studio,Memory Management,Dispose,我想知道是否有一个“技巧”可以让我们知道部分o代码中使用的对象是否已经被正确(完全)处理,或者换句话说,不会造成内存泄漏 假设我有一个GDI对象(或其他需要显式处理的对象)的容器 现在,由于我需要处理GDI对象,我需要: public class SuperPen : IDisposable { Pen _flatPen, _2DPen, _3DPen; public SuperPen() { _flatPen = (Pen)Pens.Black.Clon

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

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

现在,由于我需要处理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是否正确处理

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


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

诸如或之类的工具可以识别内存泄漏(两者都有试用版)。

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

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

这尤其适用于发布版本:由于不必要且显著的性能开销,您不应覆盖任何不直接持有非托管资源的对象的终结器。非托管资源几乎应该始终保存在从
SafeHandle
(或类似)派生的类中,以减少GC上的负载。我自发的想法是“为什么要克隆
Pens.Black
”?但它可能只是用来说明这个问题?@Frederik:这只是初始化“空”笔的一种方式。我还可以做
=新钢笔(颜色.黑色)-这样做是因为表明我的对象已经创建,最终需要释放/内存。如果不可能,ANTS是如何做到的?@Dan:我是通过分析API猜的:@280Z28:我的意思是作为一个反问——我很确定ANTS这样做(通过.NET API,至少)意味着这是可能的。也就是说,当像蚂蚁这样的东西已经存在的时候,我当然不会自己去做。
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; }
    }
}