Wie überprüft man, ob weak_ptr leer ist (nicht zugewiesen)?

8

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%     
Zuza 04.08.2017, 12:36
quelle

3 Antworten

12

Sie können zwei Aufrufe von owner_before verwenden, um die Übereinstimmung mit einem standardmäßig konstruierten (leeren) schwachen Zeiger zu überprüfen:

%Vor%

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() :

%Vor%

... oder gibt !weak.lock() zurück (~ 80 Zeilen der Assembly).

    
Holt 04.08.2017, 13:03
quelle
1

Verwenden Sie std :: weak_ptr :: expired ()

%Vor%

Ausgabe

%Vor%     
Hariom Singh 04.08.2017 12:58
quelle
0

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%     
Ron 04.08.2017 13:06
quelle

Tags und Links