std::weak_ptr<T>:: lock
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
| Modifiers | ||||
| Observers | ||||
|
weak_ptr::lock
|
||||
|
(C++26)
|
||||
|
(C++26)
|
||||
| Non-member functions | ||||
| Helper classes | ||||
|
(C++20)
|
||||
| Deduction guides (C++17) |
|
std::
shared_ptr
<
T
>
lock
(
)
const
noexcept
;
|
(seit C++11) | |
Erstellt einen neuen
std::shared_ptr
, der die Eigentümerschaft des verwalteten Objekts teilt. Wenn kein verwaltetes Objekt vorhanden ist, d.h.
*
this
leer ist, dann ist der zurückgegebene
shared_ptr
ebenfalls leer.
Effektiv gibt expired ( ) ? shared_ptr < T > ( ) : shared_ptr < T > ( * this ) zurück, atomar ausgeführt.
Inhaltsverzeichnis |
Rückgabewert
Ein
shared_ptr
, der die Eigentümerschaft des besessenen Objekts teilt, falls
std::weak_ptr::expired
false
zurückgibt. Andernfalls wird ein standardkonstruierter
shared_ptr
vom Typ
T
zurückgegeben.
Hinweise
Sowohl diese Funktion als auch der Konstruktor von
std::shared_ptr
können verwendet werden, um temporären Besitz des verwalteten Objekts zu erlangen, auf das ein
std::weak_ptr
verweist. Der Unterschied besteht darin, dass der Konstruktor von
std::shared_ptr
eine Exception wirft, wenn sein
std::weak_ptr
Argument leer ist, während
std::weak_ptr<T>::lock()
einen leeren
std::shared_ptr<T>
konstruiert.
Beispiel
#include <iostream> #include <memory> void observe(std::weak_ptr<int> weak) { if (auto p = weak.lock()) std::cout << "\tobserve() is able to lock weak_ptr<>, value=" << *p << '\n'; else std::cout << "\tobserve() is unable to lock weak_ptr<>\n"; } int main() { std::weak_ptr<int> weak; std::cout << "weak_ptr<> is not yet initialized\n"; observe(weak); { auto shared = std::make_shared<int>(42); weak = shared; std::cout << "weak_ptr<> is initialized with shared_ptr\n"; observe(weak); } std::cout << "shared_ptr<> has been destructed due to scope exit\n"; observe(weak); }
Ausgabe:
weak_ptr<> is not yet initialized
observe() is unable to lock weak_ptr<>
weak_ptr<> is initialized with shared_ptr
observe() is able to lock weak_ptr<>, value=42
shared_ptr<> has been destructed due to scope exit
observe() is unable to lock weak_ptr<>
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrektes Verhalten |
|---|---|---|---|
| LWG 2316 | C++11 | lock() war nicht als atomar vorgeschrieben, aber als noexcept erforderlich, was zu einem Widerspruch führte | als atomar spezifiziert |
Siehe auch
|
prüft, ob das referenzierte Objekt bereits gelöscht wurde
(öffentliche Elementfunktion) |