Frage

In einer Welt, wo die manuelle Zuweisung von Speicher und Pointer immer noch die Regel (Borland Delphi) ich brauche eine Allgemeine Lösung für das, was ich denke, ist ein Allgemeines problem:

Zu einem bestimmten Zeitpunkt ein Objekt referenziert werden können, die aus mehreren Orten (Listen, andere Objekte, ...).Ist es ein guter Weg, um all diese Referenzen, so dass ich diese aktualisieren können, wenn das Objekt zerstört wird?

War es hilfreich?

Lösung

Wenn Sie möchten, Benachrichtigen Sie andere änderungen, die Sie implementieren sollten die "Observer-Pattern".Delphi hat bereits für Sie erledigt für TComponent-Nachfahren.Sie können die TComponent.Methode FreeNotification und haben Ihr Objekt benachrichtigt werden, wenn die andere Komponente zerstört wird.Es bedeutet, dass durch den Aufruf der Methode Notification.Können Sie sich aus der Benachrichtigungsliste durch aufrufen von TComponent.RemoveFreeNotification.Siehe auch diese Seite.

Die meisten Garbage-Kollektoren lassen Sie sich nicht Sie erhalten eine Liste von Referenzen, so dass Sie nicht helfen in diesem Fall.Delphi tun kann, Referenz-zählen, wenn Sie Schnittstellen verwenden, aber dann müssen Sie wieder zu verfolgen, die Referenzen selbst.

Andere Tipps

Ich kann nicht ganz herausfinden, warum würden Sie wollen, dies zu tun.Sicherlich würden Sie einfach überprüfen, eine Referenz nicht Nil ist, bevor Sie es verwenden?

Anwyays, zwei mögliche Lösungen, die ich denken würde, sind:

  1. Objekte-manager Ihrer eigenen Referenz zählt.
  2. Erstellen Sie einen Verweis zählen manager-Klasse.

Ich würde wahrscheinlich fügen Sie AddRef() und ReleaseRef () - Funktionen entweder der manager oder die Referenz-bewusst-Klasse.Sie können dann diese verwenden, um zu überprüfen, wie viele Referenzen vorhanden sind, an jedem Punkt.COM hat es auf diese Weise.

Die Referenz-bewusst-Klasse, würde nur die Verwaltung eigenen Referenz-Zählung.Die manager könnten mit der Karte zu verknüpfen, Zeiger mit einem integer für die Zählung.

Sind Sie versuchen, um zu verfolgen, wer verweisen auf ein Objekt, so dass Sie können deaktivieren Sie diese Hinweise auf, wenn das Objekt zerstört wird, oder versuchen Sie zu verfolgen, wenn es sicher um das Objekt zu zerstören?

Wenn letzteres, dann ist es klingt wie Sie sind auf der Suche für einen garbage collector.Ich habe noch nie befasst mit Delphi also ich weiß nicht, ob es gibt GCs für ihn, die Sie verwenden können, aber ich wäre überrascht, wenn es da nicht.

Wenn die alten dann eine GC würde wahrscheinlich nicht helfen.Wenn Delphi unterstützt OOP/inheritence (ich ehrlich weiß nicht, ob es das tut), könnten Sie so etwas tun (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);
    }
  }
}

Im Grunde, wenn Sie einen überwachten Objekte einer Sammlung, die Sammlung würde sich selbst mit diesem Objekt.Wenn das Objekt zerstört wird (ich vermute, Sie möchten rufen Sie destroy() im Destruktor des Objekts), dann ist die Objekt-Signale der Sammlung, dass es zerstört wird, so dass die Sammlung kann tun, was es braucht, um.

Leider ist dies nicht wirklich eine gute Lösung, wenn Sie verwenden möchten, bauen-in Sammlungen.Man müsste schreiben Sie Ihre eigene Sammlung von Objekten (Sie könnte einfach wickeln build-in-ones though).Und würde es benötigen, um machen sicher, dass Sie registriert sind überall Sie möchten, um das Objekt zu verfolgen.Es ist nicht, was ich denken würde, eine "glückliche" Lösung, aber für kleine Projekte, wäre es wahrscheinlich nicht so schlimm sein.Ich bin hauptsächlich in der Hoffnung diese Idee, hilft spawn auf andere Ideen.:)

Gibt es einen bestimmten Grund, warum wollen Sie das?Sind Sie in Probleme laufen, mit rogue-Zeiger, oder Sie denken, es könnte ein problem an einem Tag?

IMHO wird es kein problem sein, wenn Sie Ihre Anwendung direkt, und mit dem entsprechenden Muster wirklich hilft.

Einige info über das Muster:

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

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top