2010-02-02 4 views
4

Je me demande s'il y a une "astuce" qui permet de savoir si les objets utilisés dans une partie de code ont été correctement (entièrement) éliminés, ou, en d'autres termes, ne crée pas de fuites de mémoire.Comment vérifier si mon objet est correctement éliminé?

Disons que j'ai un conteneur d'objets GDI (ou autre que je dois disposer explicitement)

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

Maintenant, comme je l'ai besoin de disposer les objets GDI que je fais:

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; } 
    } 
} 

Une situation comme celle-ci peut se produire si vous ajoutez un nouvel objet "jetable" et oubliez de le jeter etc. Comment puis-je détecter mon erreur, je veux dire, vérifier si mon SuperPen a été correctement éliminé?

+0

Mon spontané cependant est "pourquoi clonez-vous' Pens.Black' "? Mais il est peut-être utilisé seulement pour illustrer la question? –

+0

@Frederik: Juste est un moyen d'initialiser un stylo "vide". Je pourrais faire aussi '= new Pen (Color.Black);' - le faire parce que montrer que mon objet a été créé et finalement besoin d'une disposition/mémoire libre. – serhio

Répondre

2

Je ne pense pas que ce soit possible; le mieux que vous pouvez faire est d'obtenir un profileur (tel que ants profiler) et de le mesurer. Si vous trouvez que vous fuyez la mémoire de manière excessive (via le profileur), il y a quelque chose qui ne va pas. En dehors de l'utilisation de profileur, je ne suis pas sûr de techniques automatiques qui vous aident à identifier les ressources non-mises à jour.

+1

Si ce n'est pas possible, comment fonctionne ANTS? –

+0

@Dan: Je devine via l'API de profilage: http://www.blong.com/Conferences/DCon2003/Internals/Profiling.htm –

+0

@ 280Z28: Je voulais dire comme une question rhétorique - je suis assez sûr le fait que ANTS le fasse (via une API .NET, pas moins) signifie que c'est * possible *. Cela dit, je ne le ferais certainement pas moi-même quand quelque chose comme ANTS existe déjà. –

0

Je suggère d'utiliser ce pattern, qui incorpore un destructeur pour s'assurer que les articles non jetés sont nettoyés. Cela va attraper tout ce que vous n'appelez pas "disposer", et est un bon échec sûr.

+0

Cette * surtout * s'applique aux versions de publication: vous ne devez pas remplacer le finaliseur pour tout objet qui ne détient pas * directement * les ressources * non gérées * en raison d'un surcoût de performances non nécessaire et significatif. Les ressources non gérées devraient presque toujours être conservées dans une classe dérivée de SafeHandle (ou similaire) afin de réduire la charge sur le GC. –

0

Je crois que FxCop (disponible seul ou intégré dans les versions Team System de VS2005 +) le détectera.

Questions connexes