2010-02-02 79 views
4

我不知道是否有一個「技巧」,可以知道部分代碼中使用的對象是否已被正確(完全)處理,換句話說不會產生內存泄漏。如何檢查我的物品是否妥善處理?

比方說,我有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

我自發的,雖然是「爲什麼你克隆筆?黑」?但它也許只是用來說明這個問題? – 2010-02-02 16:36:10

+0

@Frederik:只是一種初始化「空」筆的方法。我也可以這樣做'=新筆(Color.Black);' - 這樣做是因爲顯示我的對象已經創建並且最終將需要釋放處理器/內存。 – serhio 2010-02-02 19:00:54

回答

2

不要以爲這是可能的;你可以做的最好的事情是獲得一個分析器(例如ants profiler)並測量它。如果你發現你的內存過度泄漏(通過探查器),那麼就會出現問題。

除了使用事件探查器,我不確定任何自動技術可以幫助您識別未處理的資源。

+1

如果不可能,ANTS如何做? – 2010-02-02 16:51:22

+0

@丹:我猜測通過分析API:http://www.blong.com/Conferences/DCon2003/Internals/Profiling.htm – 2010-02-02 17:52:39

+0

@ 280Z28:我的意思是它是一個修辭問題 - 我很確定螞蟻做它(通過一個.NET API,不少於)的事實意味着它*是*可能的。也就是說,當ANTS已經存在時,我當然不會自己做。 – 2010-02-02 19:05:29

0

我建議使用pattern,它包含一個析構函數來確保比未處理的物品清理乾淨。這將捕獲任何你沒有調用'處置'的東西,並且是一個很好的失敗保險箱。

+0

*特別*適用於發佈版本:由於不必要的重大性能開銷,您不應該爲任何不直接*保留*非託管*資源的對象覆蓋終結器。非託管資源幾乎總是保存在派生於SafeHandle(或類似的)的類中,以減少GC的負載。 – 2010-02-02 16:35:43

0

我相信FxCop(可單獨使用或集成到VS2005 +的Team System版本中)會檢測到這一點。