Gibt es eine Möglichkeit, zwischen einem zugewiesenen (möglicherweise abgelaufenen) schwachen_ptr und einem nicht zugewiesenen zu unterscheiden.
%Vor%Ich verstehe die folgenden Überprüfungen für Nicht-Zuweisung oder Ablauf, aber gibt es eine (billigere?) Prüfung für nur Nicht-Zuweisung?
%Vor% Sie können zwei Aufrufe von owner_before
verwenden, um die Übereinstimmung mit einem standardmäßig konstruierten (leeren) schwachen Zeiger zu überprüfen:
Dies liefert nur true
wenn w{} "==" weak
, wo "=="
den Besitzer vergleicht, und entsprechend en.cppreference.com :
Die Reihenfolge ist so, dass zwei intelligente Zeiger nur dann äquivalent sind, wenn sie beide leer sind oder beide das gleiche Objekt besitzen, auch wenn die Werte der durch get () erhaltenen Zeiger unterschiedlich sind (zB weil sie auf verschiedene Unterobjekte zeigen) innerhalb desselben Objekts).
Da der Standardkonstruktor einen leeren schwachen Zeiger konstruiert, kann dies true
nur zurückgeben, wenn weak
auch leer ist. Dies wird nicht true
zurückgeben, wenn weak
abgelaufen ist.
Betrachtet man die generierte Assembly (mit Optimierung), scheint dies ziemlich optimiert zu sein:
%Vor% ... im Vergleich zur Überprüfung von weak.expired()
:
... oder gibt !weak.lock()
zurück (~ 80 Zeilen der Assembly).
Verwenden Sie std :: weak_ptr :: expired ()
%Vor%Ausgabe
%Vor%Sie könnten versuchen, einen gemeinsamen Zeiger zu erstellen, der einen schwachen Zeiger als Parameter akzeptiert und ein std :: bad_weak_ptr auslöst Ausnahme, wenn ein schwacher Zeiger abgelaufen ist (oder nicht wie in Ihrem Fall):
%Vor%