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!