Frage

Ich mache eine Menge für die Verwendung von boost :: scoped_ptr in meinem Code und es ist toll, aber ich bin derzeit mit Software arbeiten, die Shared_ptr über den ganzen Ort verwendet und ich frage mich, wenn ich etwas fehle.

AFAIK ein shared_ptr nur sinnvoll, wenn verschiedene Threads werden die gleichen Daten zugreifen, und Sie wissen nicht, was die Fäden bestellen beenden wollen (mit dem Shared_ptr sichergestellt wird, dass das Objekt vorhanden ist, bis der letzte Faden mit fertig ist it).

Gibt es andere Anwendungsfälle?

War es hilfreich?

Lösung

Themen sind hier irrelevant. Entscheidend ist, ob es einfach ist, einen Punkt zu bestimmen, an dem das Objekt nicht mehr verwendet wird.

Nehmen wir an verschiedene Objekte das gleiche Objekt verwendet werden soll. Es könnte eine Packung von Daten oder zur Eingabe / Ausgabe oder irgendein geometrischen Objekt, oder was auch immer sein. Sie wollen das gemeinsame Objekt gelöscht werden, nachdem alle der Verwendung Objekte gelöscht werden, und auch nicht vor einem Taktzyklus. Anstatt herausfinden, welche zu besitzen Objekt die längste Lebensdauer haben wird (und das kann, wenn Sie das Programm ändern ändern, oder vielleicht durch Interaktion mit dem Benutzer), können Sie ein shared_ptr verwenden, dieses Verhalten zu erzwingen.

Es spielt keine Rolle, ob die Verwendung von Objekten in der gleichen oder verschiedenen Threads sind. Objekte können unvorhersehbare Lebensdauern haben, auch wenn sie alle im selben Thread sind.

Andere Tipps

  

AFAIK ein shared_ptr ist nur sinnvoll, wenn   verschiedene Themen werden sein   Zugriff auf die gleichen Daten

Nun, es ist für Situationen, in denen mehrere Besitzer besitzen das gleiche Objekt durch die Smart-Zeiger zeigt. Sie können die Smart-Pointer von verschiedenen Threads zugreifen und shared_ptr ist verwendbar in diesem Bereich auch, aber das ist nicht die Hauptsache. Wenn der letzte Besitzer seine Referenz auf das Objekt verliert zeigte auf, der shared_ptr Mechanismus löscht das Objekt aus.

Sie können mit einem scoped_ptr , wenn alles, was Sie haben wollen, ist ein Zeiger, der gelöscht wird, wenn der Rahmen in der sie erstellt hat gelassen wird (entweder durch Ausnahmen durch einen goto an einen Ort außerhalb oder durch normalen Steuerfluss oder einen anderen Mechanismus). Wenn Sie es so verwenden, gibt es keine Notwendigkeit, Shared_ptr zu ändern.

Der Unterschied zwischen scoped_ptr und shared_ptr (und auto_ptr) ist in erster Linie kopiert Semantik.

  • scoped_ptr ist für „ Ressourcenzuordnung ist die Initialisierung “ und ist nicht kopierbar (es kann nicht sein, Gemeinschaftliche Nutzung mit anderen Instanzen und Eigentum nicht übertragen)
  • werden
  • ist shared_ptr für die automatische Rückgewinnung von Speicher, wenn zwischen mehreren Parteien geteilt
  • auto_ptr ist kopierbar (und überträgt das Eigentum, wenn zugewiesen)

Ein weiterer wichtiger Unterschied zwischen shared_ptr und scoped_ptr ist, dass nur Shared_ptr mit weak_ptr arbeiten. Schwache Zeiger werden verwendet Zyklen des gemeinsamen Zeigers zu brechen, wodurch Speicherlecks zu vermeiden, aber weak_ptr kann für mehr als das verwendet werden.

Gemeinsam und schwacher Zeiger kann verwendet werden, um den Unterschied zwischen Besitz und nicht-besitzenden Referenzen zum Ausdruck bringen. Eindeutiges Besitz von Daten führt zu einem saubereren Design, so dass, wenn möglich, Datenobjekte sollten von einem einem anderen Objekt durch ein shared_ptr gehört. Alle anderen langlebigen Referenzen auf Datenobjekte sollten schwache Zeiger sein, ihre Nicht-Eigentum an den Daten zum Ausdruck. Jedes Mal, alle nicht-besitzenden Module auf die Daten zugreifen, müssen sie die weak_ptr in eine shared_ptr konvertieren, an welcher Stelle sie feststellen, dass das Datenobjekt nicht mehr existiert. Während jedoch die nicht-besitzenden Module des Datenobjekts zugreifen, sie halten es durch vorübergehende shared_ptr, einen sicheren Betrieb zu gewährleisten, selbst wenn der besitzende Objekt, um die Daten zu veröffentlichen sind.

Wie bereits beantwortet, ist Shared_ptr über gemeinsame Verantwortung. Aber ich würde die gemeinsame Verantwortung argumentieren wird in der Regel eine schlechte Sache (Ausnahmen geben, wie Fliegengewicht Muster), und es ist besser, einen Eigentümer zu identifizieren und eine scoped_ptr setzt es.

A Shared_ptr ist ein intelligenter Zeigertyp, die Referenzzählung des Falles ist. Wenn es nur ein Besitzer für das Objekt (häufiger Fall) ist, dann scoped_ptr ist die richtige Lösung. Wenn das Objekt unter mehreren Teilen des Codes geteilt wird, dann wird shared_ptr nicht zulassen, das Objekt zerstört werden, bis alle Verweise auf sie freigegeben wurden.

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