Frage

In meinem aktuellen Projekt, das ich bin mit boost::shared_ptr recht umfangreich.

Vor kurzem meine Kolleginnen und Teamkollegen haben auch mit weak_ptr gestartet. Ich weiß nicht, welche zu benutzen und wann.

Abgesehen davon, was soll ich tun, wenn ich will weak_ptr zu shared_ptr konvertieren. eine Sperre auf weak_ptr Hat Putting einen shared_ptr zu erstellen beeinflussen meinen Code in anderen Thread?

War es hilfreich?

Lösung

Im Allgemeinen und Zusammenfassung,

Starke Zeiger garantieren ihre eigene Gültigkeit. Verwenden Sie sie, zum Beispiel, wenn:

  • Sie besitzen das Objekt gerichtet werden an; Sie schaffen es und es zerstören
  • Sie haben nicht Verhalten definiert, wenn das Objekt nicht vorhanden ist
  • Sie müssen erzwingen, dass das Objekt vorhanden ist.

Schwache Zeiger Garantie Wissen ihre eigene Gültigkeit. Verwenden Sie sie, zum Beispiel, wenn:

  • Sie erreichen es, aber es ist nicht deine.
  • Sie haben das Verhalten definiert, wenn das Objekt nicht existiert

Sperren () auf einem schwachen Zeiger gibt einen starken Zeiger; Dies ist, wie Sie den schwachen Zeiger zuzugreifen. Wenn das Objekt nicht mehr gültig ist (es wird gelöscht, usw.), dann der starke Zeiger NULL sein, sonst ist es im Objekt verweisen. Sie müssen dies überprüfen.

Es ist so eingerichtet, so dass Sie nicht versehentlich das Objekt löschen können, während Sie es verwenden, weil Sie einen temporären (lokal) starken Zeiger vorgenommen haben, und damit die Existenz des Objekts garunteed während der starken Zeiger bleiben. Wenn Sie mit dem Objekt geschehen, können Sie im Allgemeinen die starke Zeiger Anwendungsbereich fallen (oder es Neuzuweisung), die dann das Objekt gelöscht werden können. Für Multithreading, so dass sie mit der gleichen Sorgfalt zu behandeln behandeln Sie andere Dinge, die Sie haben, Thread-Sicherheit nicht in integrierten, unter Hinweis darauf, dass die Garantie die ich oben erwähnt wird halten, wenn Multithreading. AFAIK sie tun nichts besondere Vergangenheit der.

Die Anhebungs gemeinsamen Zeiger haben auch Müll-Sammler wie Features, da, wenn der letzte starke Zeiger auf ein Objekt weggeht oder Punkte woanders, wird das Objekt gelöscht.

Es gibt auch die Leistung und kreisförmig in den anderen Antworten erwähnt Abhängigkeiten.

Im Grunde würde ich sagen, dass die Boost-shared pointer Bibliothek Sie kann Schlamassel nicht zusammen ein Programm aufstellen, aber es ist kein Ersatz für die Zeit nehmen, um richtig Ihre Zeiger zu entwerfen, Objekt Eigentümern und Lebensdauern. Wenn Sie ein solches Design haben, können Sie die Bibliothek verwenden, um es zu erzwingen. Wenn Sie nicht über eine solche Konstruktion haben, sind Sie wahrscheinlich in verschiedene Probleme laufen als vorher.

Andere Tipps

Verwenden weak_ptr, wenn die Objekte, die Sie erstellen enthalten zyklische Referenzen, das heißt shared_ptr auf ein Objekt mit einem shared_ptr zurück zu sich selbst. Dies liegt daran, shared_ptr nicht zyklische Referenzen verarbeiten kann - wenn beide Objekte Umfang hinausgehen, die gegenseitige Referenzierung bedeutet, dass sie nicht „Müll gesammelt“, so dass der Speicher verloren, und Sie haben einen Speicherverlust. Da weak_ptr die Referenzzähler nicht erhöht, das zyklische Referenz Problem tritt nicht auf. Dies bedeutet auch, in der Regel, dass, wenn Sie nur einen Zeiger auf etwas nehmen möchten, die Referenz gezählt und tun ihre Referenzzähler nicht erhöhen wollen, dann weak_ptr verwenden.

Sie können aber shared_ptr verwenden.

Für weitere Informationen besuchen Sie die Boost- Dokumentation .

Gemeinsame Zeiger implementieren Referenzzählung, schwache Zeiger haben keinen Einfluss auf die Referenzzählung und wenn Sie zu tun haben nicht mit anderen geteilt Zeiger auf ein Objekt, nur schwache Zeiger, wird das Objekt gelöscht und die schwachen Zeiger Sie jetzt sagen, dass das Objekt verloren gegangen ist .

Es gibt zwei Gründe, einen schwachen Zeiger zu verwenden:

  1. Um die Kosten der Referenzzähler Zunahme / Abnahme zu beseitigen; jedoch sollten Sie dies nicht tun, weil es fehleranfällig ist und nicht wirklich sparen viel Zeit
  2. In Buchhaltung Datenstrukturen, z.B. Sie haben einen Index aller Foo-Objekte, die „lebendig“, das heißt verwendet woanders sind, und Sie wollen nicht ein Foo am Leben in den Index zu halten, wenn alle „echten“ Anwendungen beendet. Dies ist der grundlegende realistische Anwendungsfall für schwachen Zeiger. Natürlich gibt es auch andere.

So im Allgemeinen, meine Empfehlung nur schwachen Zeiger zu verwenden wäre, wenn Sie wissen, dass Sie zu löschen lassen wollen, werden die referenzierten Objekte und mögen, dass erkennen. In anderen Fällen verwenden Geteilt Zeiger (Referenzzählung) oder direkte Zeiger, esp. Methode lokale Variablen, wenn Sie wissen, dass die Objekte gelöscht werden nicht erhalten. Auch fehleranfällige, obwohl, aber schneller als gemeinsamer Zeiger.

N. B. zyklische Objekte brauchen keinen schwachen Zeiger, können Sie nicht gekocht, regelmäßige Zeiger statt in den meisten richtig konstruiert Programmen verwenden. Schwache Zeiger weniger riskant, aber.

Sie sollten wahrscheinlich schwachen Zeiger zu verwenden versuchen, überhaupt nicht, wenn Sie versuchen, eine Garbage Collector zu implementieren, die nicht eine heiße Idee in C ++, weil es zu schwer ist, den Überblick zu behalten, die falsch eng genug gehen konnte.

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