Ist es korrekt, null shared_ptr zurückzugeben?

8

Zum Beispiel gibt es eine Funktion, die ein Objekt findet und shared_ptr zurückgibt, wenn ein Objekt gefunden wird, und irgendwie angeben muss, dass kein Objekt gefunden wurde.

%Vor%
  1. Ist es korrekt, shared_ptr implizit mit nullptr wie im oberen Beispiel zu initialisieren? Es wird funktionieren, aber kann es so gemacht werden? Oder sollte ich stattdessen shared_ptr default constructed zurückgeben?

  2. Was wäre, wenn es schwach_ptr wäre? Wie kann man überprüfen, dass leerer weak_ptr zurückgegeben wurde? durch weak_ptr :: expired function oder gibt es andere Möglichkeiten? Wenn die Überprüfung durch weak_ptr :: expired der einzige Weg ist, wie kann ich dann die Funktion unterscheiden, die den leeren Zeiger zurückgegeben hat, oder ob das Objekt gerade gelöscht wurde (Multi-Thread-Umgebung)?

John Lock 15.05.2016, 05:42
quelle

1 Antwort

8
  

Ist es korrekt, shared_ptr wie im oberen Beispiel implizit mit nullptr zu initialisieren?

Ja, es ist richtig, shared_ptr mit nullptr zu initialisieren. Es ist auch richtig, nullptr zu shared_ptr zuzuweisen.

  

Oder soll ich stattdessen shared_ptr default constructed zurückgeben?

Sie können dies auf beide Arten tun: Rückgabe von shared_ptr initialisiert mit nullptr und Rückgabe von shared_ptr default constructed. Beide Wege sind richtig und beide haben den gleichen Effekt. Sie können verwenden, was Sie wollen.

  

Was wäre, wenn es schwach_ptr wäre? Wie kann man überprüfen, dass leerer weak_ptr zurückgegeben wurde? durch weak_ptr :: expired function oder gibt es andere Möglichkeiten?

weak_ptr wird nullptr (läuft ab), wenn der letzte shared_ptr , der mit dem Objekt verknüpft ist, zerstört wird.

Der richtige Weg, mit weak_ptr zu arbeiten, besteht darin, es mit lock Methode und dann mit created shared_ptr zu arbeiten. In diesem Fall wird Ihre shared_ptr nicht ablaufen, bis Sie diese neue weak_ptr haben. Wenn Sie shared_ptr nicht in weak_ptr konvertieren, kann Ihr shared_ptr jederzeit ablaufen.

Und ja, bevor Sie mit der neu erstellten weak_ptr arbeiten, müssen Sie sicherstellen, dass sie nicht null ist, weil shared_ptr möglicherweise abgelaufen ist, bevor Sie weak_ptr mit shared_ptr method erstellt haben.

%Vor%     
anton_rh 15.05.2016, 06:30
quelle