Namespaces
Variants

std::weak_ptr<T>:: lock

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
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)