Frage

Ich verwende Anhebung / Shared_ptr Zeiger während meiner Anwendung. Wenn die letzte Referenz auf ein Objekt freigegeben wird, wird Shared_ptr das Objekt für mich löschen. Die Objekte in der Anwendung abonniert Ereignisse in einer zentralen Stelle der Anwendung, ähnlich den Betrachter / Teilnehmer-Muster.

In dem Objekt Destruktoren, wird das Objekt abmelden mich aus der Liste der Abonnements. Die Liste der Abonnements ist im Wesentlichen nur ein list<weak_ptr<MyObject> >. Was ich tun möchte, ist etwas Ähnliches wie folgt aus:

Type::~Type()
{
  Subscriptions::Instance()->Remove(shared_from_this());
}

Mein Problem hier ist, dass shared_from_this nicht in Destruktoren aufgerufen werden, so der obige Code wird eine Ausnahme werfen.

In meiner alten Implementierung, die Abo-Liste war nur eine Liste von Zeigern und dann hat es funktioniert. Aber ich will stattdessen weak_ptr Referenzen verwenden, um das Risiko von mir Speicherverwaltung durch manuelle Speicher vermasseln zu reduzieren.

Da ich auf Shared_ptr verlassen Unterdrückung das Objekt zu tun, gibt es keinen einzigen Platz in meinem Code, wo ich logisch einen Anruf zu Unsubscribe platzieren kann.

Alle Ideen, was in dieser Situation zu tun?

War es hilfreich?

Lösung

  1. Sie können die Objekte im Abonnement Instanz zerstören, dann wird es automatisch die Zeiger entfernen.
  2. Sie können über vergessen sie von Abonnements zu entfernen. - Die weak_ptr ist nicht in der Lage sein ohnehin gesperrt werden, dann kann man sie entfernen
  3. Sie können eine eindeutige ID für jedes Objekt zuweisen und dann über die eindeutige ID entfernen nicht die shared_ptr
  4. Sie können einen normalen Zeiger passieren anstelle eines gemeinsamen man entfernen - es als „ID“ dienen.

Andere Tipps

  

Mein Problem hier ist, dass shared_from_this nicht aufgerufen werden kann, in   Destruktoren so den obigen Code wird eine Ausnahme werfen.

Es wird eine Ausnahme werfen , weil es abgelaufen ist , per Definition in einer destructor.

Was willst du eigentlich? Ein "abgelaufen" shared Zeiger? Erstellen Sie einfach einen leeren gemeinsamen Zeiger.

oder ein schwacher Zeiger abgelaufen?

Vielleicht, wenn Sie feststellen, dass das „Problem“ ist nicht shared_from_this Werfen (es ist ein Symptom), aber alle Besitzer ist von Natur aus bereits zurückgesetzt oder zerstört an diesem Punkt und die schwachen Zeigern abgelaufen und gleichwertig zu ein leerer Standard schwache Zeiger erstellt (*), so dass Sie nur eine Standard initialisiert schwache Zeiger übergeben sollten.

Auch Subscriptions::Instance()->Remove(weak_OR_owning_pointer) macht keinen Sinn, so oder so (mit entweder schwach oder zu besitzen Zeigern), wie Sie nicht einen schwachen Zeiger auf etwas vergleichen können, kann man nur versuchen, es zu sperren (und dann einen Vergleich zu tun).

So einfach abgelaufen schwachen Zeiger entfernen kann. Die Argumente von Remove ist nutzlos.

(*) entweder das, oder Sie haben ein sehr schweres Doppel Bug Doppel Eigentum an dem Objekt zerstört wird!

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