Kursinhalt
C++ Smart Pointers
C++ Smart Pointers
Erstellen und Verwenden von Weak Pointers
Erstellen von Weak Pointern
Sie sollten typischerweise einen std::weak_ptr
aus einem bestehenden std::shared_ptr
erstellen. Dies stellt sicher, dass der Weak Pointer ein Objekt beobachtet, das bereits von mindestens einem Shared Pointer verwaltet wird.
creating_weak_pointer
std::shared_ptr<int> p_shared = std::make_shared<int>(42); std::weak_ptr<int> p_weak(sharedPtr);
Der std::weak_ptr
p_weak
wird aus einem bestehenden std::shared_ptr
p_shared
konstruiert. Das bedeutet, dass p_weak
den Referenzzähler von p_shared
nicht erhöht, sondern stattdessen dasselbe verwaltete Objekt beobachtet. Die Gültigkeit von p_weak
hängt von p_shared
ab; wenn alle std::shared_ptr
-Instanzen, die das Objekt verwalten, zerstört werden, läuft p_weak
ab und kann nicht mehr verwendet werden, um direkt auf das Objekt zuzugreifen.
Verwendung von Weak Pointers
Um auf ein Objekt zuzugreifen, das von einem std::weak_ptr
verwaltet wird, müssen Sie es zuerst mit std::shared_ptr
in einen lock()
umwandeln. Diese Methode überprüft, ob das Objekt noch existiert, und gibt einen std::shared_ptr
darauf zurück, andernfalls gibt sie einen leeren std::shared_ptr
zurück.
Das Sperren eines Weak Pointers verhindert, dass das Objekt während der Nutzung zerstört wird. Da std::weak_ptr
nicht zur Referenzzählung beiträgt, würde der direkte Zugriff auf das Objekt das Risiko bergen, eine zerstörte Instanz zu verwenden. Die Umwandlung in einen std::shared_ptr
erhöht die Referenzzählung und stellt sicher, dass das Objekt während der Nutzung gültig bleibt.
converting
auto locked_shared = p_weak.lock(); if (locked_shared) // The object is alive, and you can use lockedSharedPtr to access it. else // The object has been deallocated, and lockedSharedPtr is empty.
Swipe to start coding
Vervollständigen Sie den folgenden Code, um einen std::weak_ptr
aus einem std::shared_ptr
zu erstellen, ihn zurück in einen std::shared_ptr
zu konvertieren und sicher auf den Wert des verwalteten Objekts zuzugreifen.
Lösung
solution
Danke für Ihr Feedback!
Erstellen und Verwenden von Weak Pointers
Erstellen von Weak Pointern
Sie sollten typischerweise einen std::weak_ptr
aus einem bestehenden std::shared_ptr
erstellen. Dies stellt sicher, dass der Weak Pointer ein Objekt beobachtet, das bereits von mindestens einem Shared Pointer verwaltet wird.
creating_weak_pointer
std::shared_ptr<int> p_shared = std::make_shared<int>(42); std::weak_ptr<int> p_weak(sharedPtr);
Der std::weak_ptr
p_weak
wird aus einem bestehenden std::shared_ptr
p_shared
konstruiert. Das bedeutet, dass p_weak
den Referenzzähler von p_shared
nicht erhöht, sondern stattdessen dasselbe verwaltete Objekt beobachtet. Die Gültigkeit von p_weak
hängt von p_shared
ab; wenn alle std::shared_ptr
-Instanzen, die das Objekt verwalten, zerstört werden, läuft p_weak
ab und kann nicht mehr verwendet werden, um direkt auf das Objekt zuzugreifen.
Verwendung von Weak Pointers
Um auf ein Objekt zuzugreifen, das von einem std::weak_ptr
verwaltet wird, müssen Sie es zuerst mit std::shared_ptr
in einen lock()
umwandeln. Diese Methode überprüft, ob das Objekt noch existiert, und gibt einen std::shared_ptr
darauf zurück, andernfalls gibt sie einen leeren std::shared_ptr
zurück.
Das Sperren eines Weak Pointers verhindert, dass das Objekt während der Nutzung zerstört wird. Da std::weak_ptr
nicht zur Referenzzählung beiträgt, würde der direkte Zugriff auf das Objekt das Risiko bergen, eine zerstörte Instanz zu verwenden. Die Umwandlung in einen std::shared_ptr
erhöht die Referenzzählung und stellt sicher, dass das Objekt während der Nutzung gültig bleibt.
converting
auto locked_shared = p_weak.lock(); if (locked_shared) // The object is alive, and you can use lockedSharedPtr to access it. else // The object has been deallocated, and lockedSharedPtr is empty.
Swipe to start coding
Vervollständigen Sie den folgenden Code, um einen std::weak_ptr
aus einem std::shared_ptr
zu erstellen, ihn zurück in einen std::shared_ptr
zu konvertieren und sicher auf den Wert des verwalteten Objekts zuzugreifen.
Lösung
solution
Danke für Ihr Feedback!