Domanda

In un mondo in cui l'allocazione manuale della memoria e i puntatori dominano ancora (Borland Delphi) ho bisogno di una soluzione generale per quello che penso sia un problema generale:

In un dato momento è possibile fare riferimento a un oggetto da più posti (elenchi, altri oggetti, ...).Esiste un buon modo per tenere traccia di tutti questi riferimenti in modo da poterli aggiornare quando l'oggetto viene distrutto?­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

È stato utile?

Soluzione

Se vuoi notificare ad altri le modifiche dovresti implementare il file "Modello osservatore".Delphi lo ha già fatto per te per i discendenti di TComponent.Puoi chiamare il metodo TComponent.FreeNotification e fare in modo che il tuo oggetto riceva una notifica quando l'altro componente viene distrutto.Lo fa chiamando il metodo Notification.Puoi rimuoverti dall'elenco delle notifiche chiamando TComponent.RemoveFreeNotification.Vedi anche questa pagina.

La maggior parte dei Garbage Collector non ti consente di ottenere un elenco di riferimenti, quindi non ti aiuteranno in questo caso.Delphi può eseguire il conteggio dei riferimenti se si utilizzano le interfacce, ma anche in questo caso è necessario tenere traccia dei riferimenti da soli.

Altri suggerimenti

Non riesco proprio a capire perché vorresti farlo.Sicuramente controlleresti semplicemente un riferimento non in Nil prima di usarlo?

Comunque, due possibili soluzioni che prenderei in considerazione sono:

  1. Chiedi agli oggetti di gestire i propri conteggi di riferimento.
  2. Creare una classe di gestione del conteggio dei riferimenti.

Probabilmente aggiungerei le funzioni AddRef() e ReleaseRef() al gestore o alla classe in grado di riconoscere i riferimenti.È quindi possibile utilizzarli per verificare quanti riferimenti esistono in qualsiasi momento.COM fa in questo modo.

La classe in grado di riconoscere i riferimenti gestirebbe solo il proprio conteggio dei riferimenti.Il manager potrebbe utilizzare una mappa per associare i puntatori a un numero intero per il conteggio.

Stai cercando di tenere traccia di chi fa riferimento a un oggetto in modo da poter cancellare tali riferimenti quando l'oggetto viene distrutto o stai cercando di tenere traccia di quando è sicuro distruggere l'oggetto?

In quest'ultimo caso, sembra che tu stia cercando un netturbino.Non ho mai avuto a che fare con Delphi quindi non so se ci sono GC che puoi usare, ma sarei sorpreso se non ci fossero.

Nel primo caso, probabilmente un GC non aiuterebbe.Se Delphi supporta OOP/ereditarietà (onestamente non so se lo fa) potresti fare qualcosa del genere (pseudocodice):

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

Fondamentalmente, ogni volta che aggiungi uno dei tuoi oggetti tracciati a una raccolta, tale raccolta si registrerebbe con quell'oggetto.Quando l'oggetto viene distrutto (immagino che chiameresti destroy() nel distruttore dell'oggetto), l'oggetto segnala alla raccolta che viene distrutto in modo che la raccolta possa fare tutto ciò di cui ha bisogno.

Sfortunatamente, questa non è davvero una buona soluzione se desideri utilizzare raccolte integrate.Dovresti scrivere i tuoi oggetti di raccolta (potrebbero però semplicemente racchiudere quelli incorporati).E sarebbe necessario assicurarsi di registrarsi ovunque si desideri tracciare l'oggetto.Non è quella che considererei una soluzione "felice", anche se per piccoli progetti probabilmente non sarebbe poi così male.Spero principalmente che questa idea possa aiutare a generare altre idee.:)

C'è un motivo specifico per cui lo desideri?Stai riscontrando problemi con puntatori non autorizzati o pensi che potrebbe diventare un problema un giorno?

IMHO non sarà un problema se progetti correttamente la tua applicazione e l'utilizzo dei modelli appropriati ti aiuta davvero.

Alcune informazioni sugli schemi:

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

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top