Question

Dans un monde où l'allocation manuelle de mémoire et les pointeurs règnent toujours (Borland Delphi), j'ai besoin d'une solution générale à ce que je pense être un problème général :

A un instant donné un objet peut être référencé depuis plusieurs endroits (listes, autres objets, ...).Existe-t-il un bon moyen de garder une trace de toutes ces références afin de pouvoir les mettre à jour lorsque l'objet est détruit ?­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

Était-ce utile?

La solution

Si vous souhaitez informer les autres des changements, vous devez mettre en œuvre le "Modèle d'observateur".Delphi l'a déjà fait pour vous pour les descendants de TComponent.Vous pouvez appeler la méthode TComponent.FreeNotification et que votre objet soit averti lorsque l'autre composant est détruit.Pour ce faire, il appelle la méthode Notification.Vous pouvez vous supprimer de la liste de notifications en appelant TComponent.RemoveFreeNotification.Regarde aussi cette page.

La plupart des éboueurs ne vous permettent pas d'obtenir une liste de références, ils ne vous aideront donc pas dans ce cas.Delphi peut effectuer un comptage de références si vous utilisez des interfaces, mais là encore, vous devez suivre vous-même les références.

Autres conseils

Je n'arrive pas à comprendre pourquoi vous voudriez faire ça.Vous voudriez sûrement simplement vérifier une référence non nulle avant de l'utiliser ?

Quoi qu'il en soit, deux solutions possibles que j'envisagerais sont :

  1. Demandez au gestionnaire d'objets de disposer de son propre nombre de références.
  2. Créez une classe de gestionnaire de comptage de références.

J'ajouterais probablement les fonctions AddRef() et ReleaseRef() au gestionnaire ou à la classe sensible aux références.Vous pouvez ensuite les utiliser pour vérifier combien de références existent à tout moment.COM le fait de cette façon.

La classe sensible aux références gérerait uniquement son propre décompte de références.Le gestionnaire pourrait utiliser une Map pour associer des pointeurs à un entier pour le comptage.

Essayez-vous de savoir qui fait référence à un objet afin de pouvoir effacer ces références lorsque l'objet est détruit, ou essayez-vous de savoir quand il est sûr de détruire l'objet ?

Dans ce dernier cas, il semble que vous recherchiez un éboueur.Je n'ai jamais eu affaire à Delphi, donc je ne sais pas s'il existe des GC que vous pouvez utiliser, mais je serais surpris s'il n'y en avait pas.

Dans le premier cas, un GC n'aiderait probablement pas.Si Delphi prend en charge la POO/l'héritage (honnêtement, je ne sais pas si c'est le cas), vous pouvez faire quelque chose comme ceci (pseudocode) :

// Anything that will use one of your tracked objects implements this interface
interface ITrackedObjectUser {
  public void objectDestroyed(TrackedObject o);
}

// All objects you want to track extends this class
class TrackedObject {
  private List<ITrackedObjectUser> users;

  public void registerRef(ITrackedObjectUser u) {
    users.add(u);
  }

  public void destroy() {
    foreach(ITrackedObjectUser u in users) {
      u.objectDestroyed(this);
    }
  }
}

Fondamentalement, chaque fois que vous ajoutez un de vos objets suivis à une collection, cette collection s'enregistre avec cet objet.Lorsque l'objet est détruit (je suppose que vous appelleriez destroy() dans le destructeur de l'objet), l'objet signale à la collection qu'il est détruit afin que la collection puisse faire tout ce dont elle a besoin.

Malheureusement, ce n'est pas vraiment une bonne solution si vous souhaitez utiliser des collections intégrées.Vous devrez écrire vos propres objets de collection (ils pourraient cependant simplement envelopper ceux intégrés).Et il faudrait s'assurer que vous vous inscrivez partout où vous souhaitez suivre l'objet.Ce n'est pas ce que je considérerais comme une solution « heureuse », même si pour les petits projets, ce ne serait probablement pas trop mal.J'espère surtout que cette idée contribuera à engendrer d'autres idées.:)

Y a-t-il une raison spécifique pour laquelle vous souhaitez cela ?Rencontrez-vous des problèmes avec des pointeurs malveillants ou pensez-vous que cela pourrait devenir un problème un jour ?

À mon humble avis, ce ne sera pas un problème si vous concevez correctement votre application, et l'utilisation des modèles appropriés vous aide vraiment.

Quelques informations sur les modèles :

http://delphi.about.com/od/oopindelphi/a/aa010201a.htm

http://www.obsof.com/delphi_tips/pattern.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top