Wie um zu testen, ob ein shared_ptr ist leer oder hat nichts

Einer C++ - std::shared_ptr<..> werden kann leer und es kann auch sein null. Diese beiden Konzepte existieren, und Sie sind nicht entspricht. Darüber hinaus werden weder die Implikation ist immer wahr, zwischen diesen Fällen.

Letzteren Fall ist trivial zu erkennen, weil operator bool bietet genau das testen. Laut der docs, es "prüft, ob *this speichert einen nicht-null-Zeiger ist, d.h. ob get() != nullptr."

Gibt es einen test für den ersten Fall, der Fall, wo das Ding leer?

Mein Einsatz für diesen ist Recht einfach. Ich habe eine Klasse, die eine statische factory-Methode. Innerhalb der statischen factory-Methode ist eine statische lokale shared_ptr zu einer Instanz der Klasse initialisiert, um nullptr. Der erste Aufruf dieser factory-Methode erstellt eine Instanz der Klasse und initialisiert die statischen lokalen shared_ptr vor der Rücksendung eine Kopie - es wird bewacht von einem mutex. Dass shared_ptr gehalten werden kann durch etwas, kopiert und weitergegeben zu, weitere Exemplare können erworben werden, durch zusätzliche Aufrufe der statischen Fabrik, und schließlich, wenn alle Kopien zerstört werden, die shared_ptr's deleter zerstört die Instanz.

Die Instanz selbst wird erstellt und zerstört mit einem legacy-C-API, umhüllt von meiner Klasse, und das, obwohl diese Instanzen gemeinsam genutzt werden sollen, wie singletons, aber auch Sie müssen gereinigt werden, wenn Sie nicht mehr benötigt werden - im Gegensatz zu singletons.

Im moment bin ich mit einem null-check, um zu entscheiden, ob die statische lokale shared_ptr sollte initialisiert werden oder lediglich kopiert. Ich fürchte, dass dieser test nicht zu erkennen, der Fall, wo die re-Initialisierung erforderlich ist - zum Beispiel, wenn etwas versucht zu erwerben, eine Instanz an, einige Zeit nachdem alle bisherigen Nutzer Gaben Ihre Referenzen und die gemeinsame Instanz wurde gelöscht.

Ist oder ist es wahr, dass shared_ptr zurückgesetzt nullptr wenn der Verweiszähler auf null fällt und die deleter aufgerufen wird? Auch für custom-deleters?

Bedeutung: Was ist der Unterschied zwischen einer leeren und einer null-std::shared_ptr in C++?

  • Wie etwa die überprüfung, ob the counter gleich null ist?
  • Da der Hinweis: "dies ist Jedoch nicht garantiert, in einer multithreaded Umgebung."
  • Wenn ich das Lesen, es klingt wie es wird immer einen reference count von 1 für einige shared_ptr-Objekts, nachdem die erste Initialisierung stattfindet. Wenn nicht, für welches Objekt würden Sie in diesem hypothetischen rufen, um zu bestimmen, Ihren aktuellen Zustand? Es klingt wie Sie vielleicht möchten weak_ptr Verhalten. Oder vielleicht könnten Sie kurz erläutern und die Frage, um diesen Punkt deutlicher (d.h. den Fall "wenn etwas versucht zu erwerben, eine Instanz an, einige Zeit nachdem alle bisherigen Nutzer Gaben Ihre Referenzen und die gemeinsame Instanz gelöscht wurde").
  • Dein Anwendungsfall klingt nicht richtig. Sie haben eine statische shared_ptr und Sie die aushändigung von Kopien zu. Dieses eigentlich macht es so singelton die statische Instanz wird nie aufgeräumt. Wenn Sie ein singleton-Sie können auch std::unique_ptr für die Instanz und die Rückkehr der raw-pointer durch Ihre Fabrik.
InformationsquelleAutor Xharlie | 2017-02-08
Schreibe einen Kommentar