2010-02-23 3 views
2

J'ai une question de fuite de mémoire. Est-ce que les instances d'obj seront éligibles pour la récupération de place jusqu'à ce que l'instance de classe de TopClass soit hors de portée?Est-ce que cela cause une fuite de mémoire (dans .NET)?

public class TopClass 
{ 
    public void MyFunction() 
    { 
    TestClass obj = new TestClass(); 
    obj.PropertyChanged += (s,e) => { //Do some code }; 
    obj = null; 
    } 
} 

En outre cela que tous les objets qui instancient un TopClass et invoquer MyFunction() pour ne pas être admissible à droite GC?

Je comprends que dans le code managé une fois que l'application est hors de portée, tous les objets sont éligibles, mais je veux savoir que lorsque mon application est en cours d'exécution, cela causera une fuite de mémoire. Droite?

Répondre

4

Non. obj seront recueillies tout droit. Rien dans ce code ne provoque une référence forte.

Un objet peut être maintenu en vie en étant attaché en tant que gestionnaire d'événements, mais un objet ne peut pas être maintenu en vie en ayant des gestionnaires d'événements.

+0

Oui, l'instance TestClass peut être collectée juste après (ou même pendant) l'appel à MyFunction. – Steven

3

obj sera éligible pour le ramassage des ordures dès que vous le définissez trop nul (mais la collecte sera faite plus tard bien sûr). L'abonnement à l'événement PropertyChanged ne crée pas de référence à obj, il crée une référence d'obj à l'instance de TopClass. Et cela n'empêchera pas non plus la collecte de l'instance TopClass, sauf si elle est référencée ailleurs