我想知道是否有一个“技巧”允许知道代码部分中的已使用对象是否已正确(完全)处理,或者换句话说,不会造成内存泄漏。
假设我有一个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是否妥善处理?
答案 0 :(得分:2)
不要认为这是可能的;您可以做的最好的事情是获取一个分析器(例如ants profiler)并进行测量。如果您发现过度泄漏内存(通过分析器),那么就会出现问题。
除了使用分析器之外,我不确定是否有任何自动技术可以帮助您识别不可用的资源。
答案 1 :(得分:1)
MemProfiler或ANTS Memory Profiler等工具会识别内存泄漏(两者都有试用版)。
答案 2 :(得分:0)
我建议使用这个pattern,它包含一个析构函数,以确保清理未处理的项目。这将抓住你没有称之为“处置”的任何东西,并且是一个很好的故障安全。
答案 3 :(得分:0)
我相信FxCop(可单独使用或集成到VS2005 +的Team System版本中)将检测到这一点。