Namespaces
Variants

std:: weak_ptr

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)
Definiert im Header <memory>
template < class T > class weak_ptr ;
(seit C++11)

std::weak_ptr ist ein intelligenter Zeiger, der eine nicht-besitzende ("schwache") Referenz auf ein Objekt hält, das von std::shared_ptr verwaltet wird. Es muss zu std::shared_ptr konvertiert werden, um auf das referenzierte Objekt zugreifen zu können.

std::weak_ptr modelliert temporären Besitz: Wenn auf ein Objekt nur dann zugegriffen werden muss, falls es existiert, und es jederzeit von jemand anderem gelöscht werden kann, wird std::weak_ptr verwendet, um das Objekt zu verfolgen, und es wird in std::shared_ptr umgewandelt, um temporären Besitz zu erlangen. Falls das ursprüngliche std::shared_ptr zu diesem Zeitpunkt zerstört wird, wird die Lebensdauer des Objekts verlängert, bis das temporäre std::shared_ptr ebenfalls zerstört wird.

Eine weitere Verwendung für std::weak_ptr ist das Unterbrechen von Referenzzyklen, die durch Objekte gebildet werden, die von std::shared_ptr verwaltet werden. Wenn ein solcher Zyklus verwaist (d.h. es gibt keine externen Shared Pointer in den Zyklus), können die shared_ptr Referenzzähler nicht auf Null sinken und der Speicher wird nicht freigegeben. Um dies zu verhindern, kann einer der Pointer im Zyklus als Weak-Pointer ausgelegt werden .

Inhaltsverzeichnis

Mitgliedertypen

Mitgliedstyp Definition
element_type

T

(bis C++17)

std:: remove_extent_t < T >

(seit C++17)

Memberfunktionen

erstellt einen neuen weak_ptr
(öffentliche Elementfunktion)
zerstört einen weak_ptr
(öffentliche Elementfunktion)
weist den weak_ptr zu
(öffentliche Elementfunktion)
Modifikatoren
gibt das Eigentum am verwalteten Objekt frei
(öffentliche Elementfunktion)
tauscht die verwalteten Objekte
(öffentliche Elementfunktion)
Beobachter
gibt die Anzahl der shared_ptr -Objekte zurück, die das Objekt verwalten
(öffentliche Elementfunktion)
prüft, ob das referenzierte Objekt bereits gelöscht wurde
(öffentliche Elementfunktion)
erstellt einen shared_ptr , der das referenzierte Objekt verwaltet
(öffentliche Elementfunktion)
bietet eigentümerbasierte Ordnung von Weak Pointern
(öffentliche Elementfunktion)
(C++26)
bietet eigentümerbasiertes Hashing von Weak Pointern
(öffentliche Elementfunktion)
bietet eigentümerbasierte Gleichheitsvergleiche von Weak Pointern
(öffentliche Elementfunktion)

Nicht-Member-Funktionen

spezialisiert den std::swap Algorithmus
(Funktionsschablone)

Hilfsklassen

atomarer Weak-Zeiger
(Klassen-Template-Spezialisierung)

Deduction guides (seit C++17)

Hinweise

Wie std::shared_ptr speichert eine typische Implementierung von weak_ptr zwei Zeiger:

  • einen Zeiger auf den Kontrollblock; und
  • den gespeicherten Zeiger des shared_ptr , von dem er konstruiert wurde.

Ein separater gespeicherter Zeiger ist notwendig, um sicherzustellen, dass die Konvertierung eines shared_ptr zu einem weak_ptr und zurück korrekt funktioniert, selbst für aliased shared_ptr s. Es ist nicht möglich, auf den gespeicherten Zeiger in einem weak_ptr zuzugreifen, ohne ihn in einen shared_ptr zu locken.

Feature-Test Makro Wert Std Funktion
__cpp_lib_smart_ptr_owner_equality 202306L (C++26) Ermöglicht die Verwendung von std::weak_ptr als Schlüssel in ungeordneten assoziativen Containern

Beispiel

Demonstriert, wie lock verwendet wird, um die Gültigkeit des Zeigers sicherzustellen.

#include <iostream>
#include <memory>
std::weak_ptr<int> gw;
void observe()
{
    std::cout << "gw.use_count() == " << gw.use_count() << "; ";
    // we have to make a copy of shared pointer before usage:
    if (std::shared_ptr<int> spt = gw.lock())
        std::cout << "*spt == " << *spt << '\n';
    else
        std::cout << "gw is expired\n";
}
int main()
{
    {
        auto sp = std::make_shared<int>(42);
        gw = sp;
        observe();
    }
    observe();
}

Ausgabe:

gw.use_count() == 1; *spt == 42
gw.use_count() == 0; gw is expired

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 3001 C++17 element_type wurde nicht für Array-Unterstützung aktualisiert aktualisiert

Siehe auch

(C++11)
Intelligenter Zeiger mit eindeutiger Objektbesitzsemantik
(Klassentemplate)
(C++11)
Intelligenter Zeiger mit gemeinsamer Objektbesitzsemantik
(Klassentemplate)