2009-10-16 11 views
5

J'ai une liste double liée (file d'attente) que j'ai créée seule.Effacement d'une liste à double liaison

Je me demande, pour effacer la liste chaînée, suffit-il de supprimer simplement les références de tête et de queue?

par exemple

public void Clear() 
{ 
    Head = null; 
    Tail = null; 
} 

J'IMAGERIE un effet domino, mais j'ai un test mal il. L'objet entier apparaîtra vide au moins. Toutes les demandes de données (telles que peek, dequeue etc.) retournent null. Vous pouvez également facilement mettre en file d'attente de nouveaux objets. Purement fonctionnel, il semble fonctionner. Mais j'aimerais vraiment savoir si je le fais de la bonne façon.

Répondre

7

La réponse courte est oui, garbage collection effacera tous les nœuds de liste liés, à condition que rien externe ne leur contienne une référence.

Le moyen le plus simple de tester consiste à ajouter un finaliseur à votre objet nœud de liste chaînée qui génère une journalisation. Notez que vous ne pouvez pas savoir quand le garbage collector fonctionne (sans le forcer, via GC.Collect()), donc vous ne verrez pas le finalizer appelé dès que vous appelez la méthode Clear().

L '"effet domino" ne va pas se produire, cependant; cela n'a pas d'importance si les références sont conservées sur un objet, plutôt que les références peuvent être retracées à la pile ou à un objet statique. Donc, si plusieurs objets se réfèrent l'un à l'autre, mais rien ne s'y réfère, ils seront tous collectés simultanément.

+0

Merci, ça explique bien les choses – CasperT

4

À moins que les objets de la collection ne doivent être éliminés, et que c'est la responsabilité de la collection de le faire, alors votre méthode est probablement la meilleure.

Puisqu'il n'y a pas de racine à l'objet (pas de références en direct), la récupération de place peut le ramasser et l'enlever.

+0

La question est, cela se produira en un seul passage du GC, ou sera chaque « ligne » dans l'effet domino que l'OP décrit il prendre une seule passe? –

+0

Merci pour la réponse. C'était rassurant. J'accepterai FacticiusVir cependant, parce qu'il a expliqué ce qui se passera plus complètement :) – CasperT

+2

Il va se passer en un seul passage.Garbage Collection ne supprime pas uniquement les objets sans référence en direct, il tente plutôt de retrouver des références à ce que l'on appelle les «racines», essentiellement des choses comme des variables statiques, des variables locales dans des méthodes encore en cours, etc. des objets n'a pas une telle référence enracinée, la chaîne entière peut être recueillie dans le même passage. –

2

Je suis IMAGERIE un effet domino

Ce n'est pas le fonctionnement du GC. Le GC marque d'abord tout "mort", puis commence par les objets racine qu'il parcourt tous les objets référencés par eux, marquant chacun comme "vivant".

Puisque votre liste n'est plus référencée par aucun objet racine (ou enfant de), elle sera marquée "morte". La seconde passe libère ensuite les objets "morts". Je doute que vous puissiez supposer dans un finaliseur que les objets de chaque côté de la liste n'ont pas été collectés en premier, c'est-à-dire que ce sera dans l'ordre du GC et non dans l'ordre de la liste.

Un peu plus en détail ici: - http://msdn.microsoft.com/en-us/magazine/bb985010.aspx

Questions connexes