2009-01-28 9 views
1

J'ai une structure de type graphique. Je ne sais pas exactement quand détruire les objets de manière traditionnelle Delphi, mais je voudrais plutôt mettre en place quelque chose comme des objets comptés de référence. Je sais que je peux utiliser quelque chose comme object.GetReference et object.Release au lieu de Free, et utiliser une variable privée pour le comptage des références, mais y a-t-il un meilleur moyen?Comment implémenter des objets comptés de référence dans Delphi

Merci

Répondre

15

Si vous avez des problèmes pour déterminer la manière correcte (placer, ordonner et ainsi de suite) de détruire des objets standard dans un programme Delphi, utiliser des objets ou des interfaces comptés ne vous aidera pas du tout. Je comprends que vous voulez que les nœuds d'un graphique conservent des références les uns aux autres, et lorsqu'il n'y a plus de références à un objet, il doit être détruit automatiquement. Mais considérons le fait que deux nœuds peuvent chacun avoir une référence à l'autre nœud, et le nombre de ref n'atteindra jamais 0, de sorte que ces objets ne seront jamais libérés. Vous aurez besoin de casser au moins une des références/dépendances manuellement. Et si vous devez le faire de toute façon, vous pouvez tout aussi bien ignorer le décompte des références. Pour plus d'informations, voir l'article Wikipedia sur weak references. Les interfaces peuvent être utilisées dans Delphi pour le comptage des références, mais les références faibles ne peuvent être maintenues qu'avec un typecasting intelligent. Pour un exemple, voir this source code and its comments. Une idée que vous pourriez vouloir explorer est de conserver la gestion standard de la durée de vie de vos objets et de laisser les objets graphiques suivre les dépendances à la place.

Laissez chaque objet graphique avoir une liste d'autres objets avec lesquels il a des connexions. Maintenant vous pouvez simplement libérer n'importe lequel des objets, et le code d'entretien de la liste supprimera toutes les références à l'objet détruit de tous les autres objets. Si vous voulez modifier le graphique, il vous suffit de libérer les nœuds que vous voulez supprimer, et les dépendances seront mises à jour. Si vous voulez détruire tout le graphique, détruisez tous les nœuds. Fondamentalement, vous avez une liste de nœuds (propriété, gestion de la durée de vie) et une autre structure de données pour décrire le graphique.

+1

+1 La réponse la plus complète à propos de ce problème. Voir aussi http://stackoverflow.com/questions/171730/interface-recursion-and-reference-counting pour une solution plus simple si tous les enfants appartiennent tous à leurs parents. –

3

Vous pouvez utiliser des interfaces au lieu d'objets, les objets seront underlaying automatiquement comptés référencent, et la meilleure chose est que delphi va détruire des objets pour vous, quand refcount = 0.

2

Comme vous avez probablement savoir, Delphi n'a pas de garbage collector.

Vous feriez mieux de faire descendre vos objets de TInterfacedObject. Quelque chose comme

type 
    IMyObject = interface 
    [Guid] 
    end; 

    MyObject = class(IMyObject, TInterfacedObject) 
    end; 

var 
    myObject: IMyObject; 
begin 
    myObject := TMyObject.Create; 
end 

La variable myObject est compté référence et sera libéré lorsque son compteur de référence tombe à zéro.

2

Si vous utilisez D2009, vous pouvez utiliser l'implémentation de Smart Pointers de Barry Kelly.

http://barrkel.blogspot.com/2008/11/somewhat-more-efficient-smart-pointers.html

Sinon, l'utilisation d'interfaces est votre meilleur pari. Créez une interface avec TOUTES les fonctionnalités dont vous avez besoin, créez un objet qui implémente cette interface et descend de TInterfacedObject, puis utilisez des interfaces partout, pas l'objet.

+0

Attention: l'utilisation de pointeurs intelligents ou d'interfaces partout dans les structures de graphe crée des problèmes avec les références cycliques. Ceux-ci doivent être brisés manuellement, ou des références faibles doivent également être utilisées. – mghie

Questions connexes