weak_ptr
-Klasse
Umschließt einen schwach verknüpften Zeiger.
Syntax
template<class T> class weak_ptr;
Parameter
T
Der vom schwachen Zeiger gesteuerte Typ.
Hinweise
Die Klassenvorlage beschreibt ein Objekt, das auf eine Ressource verweist, die von einem oder shared_ptr
mehreren Objekten verwaltet wird. Die weak_ptr
Objekte, die auf eine Ressource verweisen, wirken sich nicht auf die Referenzanzahl der Ressource aus. Wenn das letzte shared_ptr
Objekt, das diese Ressource verwaltet, zerstört wird, wird die Ressource freigegeben, auch wenn weak_ptr
Objekte auf diese Ressource verweisen. Dieses Verhalten ist unerlässlich, um Zyklen in Datenstrukturen zu vermeiden.
Ein weak_ptr
Objekt verweist auf eine Ressource, wenn es aus einem shared_ptr
Objekt erstellt wurde, das diese Ressource besitzt, wenn es aus einem weak_ptr
Objekt erstellt wurde, das auf diese Ressource verweist, oder wenn diese Ressource ihm operator=
zugewiesen wurde. Ein weak_ptr
Objekt bietet keinen direkten Zugriff auf die Ressource, auf die es verweist. Code, der die Ressource verwenden muss, erfolgt über ein shared_ptr
Objekt, das diese Ressource besitzt, die durch Aufrufen der Memberfunktion lock
erstellt wird. Ein weak_ptr
Objekt ist abgelaufen, wenn die Ressource, auf die sie verweist, freigegeben wurde, da alle shared_ptr
Objekte, die die Ressource besitzen, zerstört wurden. Durch Aufrufen lock
eines weak_ptr
Objekts, das abgelaufen ist, wird ein leeres shared_ptr
Objekt erstellt.
Ein leeres weak_ptr
Objekt verweist nicht auf Ressourcen und weist keinen Steuerelementblock auf. Die Memberfunktion lock
gibt ein leeres shared_ptr
Objekt zurück.
Ein Zyklus tritt auf, wenn es für zwei oder mehr Ressourcen, die von shared_ptr
-Objekten gesteuert werden, shared_ptr
-Objekte gibt, die gegenseitig auf sich verweisen. Angenommen, eine kreisförmig verknüpfte Liste mit drei Elementen hat den Kopfknoten N0
; dieser Knoten enthält ein shared_ptr
-Objekt, das den nächsten Knoten, N1
, besitzt; dieser Knoten enthält ein shared_ptr
-Objekt, das den nächsten Knoten, N2
, besitzt; dieser Knoten wiederum enthält ein shared_ptr
-Objekt, das den Kopfknoten N0
besitzt, wodurch der Zyklus geschlossen wird. In dieser Situation werden die Referenzanzahlen nie null, und die Knoten im Zyklus werden nie freigegeben. Um den Zyklus zu vermeiden, sollte der letzte Knoten, N2
, anstelle eines shared_ptr
-Objekts ein weak_ptr
-Objekt enthalten, das auf N0
verweist. Da das weak_ptr
Objekt nicht besitzt N0
, wirkt es sich nicht auf N0
die Referenzanzahl aus, und wenn der letzte Verweis des Programms auf den Kopfknoten zerstört wird, werden auch die Knoten in der Liste zerstört.
Mitglieder
Name | Beschreibung |
---|---|
Konstruktoren | |
weak_ptr |
Erstellt ein Objekt vom Typ weak_ptr . |
Destruktoren | |
~weak_ptr |
Beschädigt ein Objekt vom Typ weak_ptr . |
TypeDefs | |
element_type |
Der Typ des Elements. |
Memberfunktionen | |
expired |
Überprüft, ob der Besitz abgelaufen ist. |
lock |
Bedingt exklusiven Besitz einer Ressource. |
owner_before |
Gibt true zurück, wenn dieses weak_ptr -Objekt vor dem bereitgestellten Zeiger angeordnet (oder kleiner als dieser) ist. |
reset |
Gibt eine in Besitz befindliche Ressource frei. |
swap |
Tauscht zwei weak_ptr -Objekte. |
use_count |
Zählt die Anzahl der shared_ptr Objekte. |
Operatoren | |
operator= |
Ersetzt eine in Besitz befindliche Ressource. |
element_type
Der Typ des Elements.
typedef T element_type; // through C++17
using element_type = remove_extent_t<T>; // C++20
Hinweise
Der Type stellt ein Synonym für den Vorlagenparameter T
dar.
Beispiel
// std__memory__weak_ptr_element_type.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
int main()
{
std::shared_ptr<int> sp0(new int(5));
std::weak_ptr<int> wp0(sp0);
std::weak_ptr<int>::element_type val = *wp0.lock();
std::cout << "*wp0.lock() == " << val << std::endl;
return (0);
}
*wp0.lock() == 5
expired
Testet, ob der Besitz abgelaufen ist, d. h., das referenzierte Objekt wurde gelöscht.
bool expired() const noexcept;
Hinweise
Die Memberfunktion gibt true
zurück, wenn *this
abgelaufen ist, andernfalls false
.
Beispiel
// std__memory__weak_ptr_expired.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
int main()
{
std::weak_ptr<int> wp;
{
std::shared_ptr<int> sp(new int(10));
wp = sp;
std::cout << "wp.expired() == " << std::boolalpha
<< wp.expired() << std::endl;
std::cout << "*wp.lock() == " << *wp.lock() << std::endl;
}
// check expired after sp is destroyed
std::cout << "wp.expired() == " << std::boolalpha
<< wp.expired() << std::endl;
std::cout << "(bool)wp.lock() == " << std::boolalpha
<< (bool)wp.lock() << std::endl;
return (0);
}
wp.expired() == false
*wp.lock() == 10
wp.expired() == true
(bool)wp.lock() == false
lock
Ruft einen shared_ptr
Besitz einer Ressource ab, die den Besitz einer Ressource teilt.
shared_ptr<T> lock() const noexcept;
Hinweise
Die Memberfunktion gibt ein leeres shared_ptr
Objekt zurück, wenn *this
es abgelaufen ist. Andernfalls wird ein shared_ptr<T>
Objekt zurückgegeben, das die Ressource besitzt, auf die *this
verweist. Gibt einen Wert zurück, der der Atomausführung entspricht expired() ? shared_ptr<T>() : shared_ptr<T>(*this)
.
Beispiel
// std__memory__weak_ptr_lock.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
int main()
{
std::weak_ptr<int> wp;
{
std::shared_ptr<int> sp(new int(10));
wp = sp;
std::cout << "wp.expired() == " << std::boolalpha
<< wp.expired() << std::endl;
std::cout << "*wp.lock() == " << *wp.lock() << std::endl;
}
// check expired after sp is destroyed
std::cout << "wp.expired() == " << std::boolalpha
<< wp.expired() << std::endl;
std::cout << "(bool)wp.lock() == " << std::boolalpha
<< (bool)wp.lock() << std::endl;
return (0);
}
wp.expired() == false
*wp.lock() == 10
wp.expired() == true
(bool)wp.lock() == false
operator=
Ersetzt eine in Besitz befindliche Ressource.
weak_ptr& operator=(const weak_ptr& ptr) noexcept;
template <class Other>
weak_ptr& operator=(const weak_ptr<Other>& ptr) noexcept;
template <class Other>
weak_ptr& operator=(const shared_ptr<Other>& ptr) noexcept;
Parameter
Other
Der Typ, der vom freigegebenen oder schwachen Zeiger gesteuert wird.
ptr
Der schwache Zeiger oder der freigegebene Zeiger, der kopiert werden soll.
Hinweise
Die Operatoren geben die Ressource frei, auf *this
die derzeit verwiesen wird, und weisen den Besitz der Ressource zu*this
, die von ptr
ihnen benannt ist. Wenn ein Operator fehlschlägt, bleibt *this
er unverändert. Jeder Operator hat einen Effekt, der weak_ptr(ptr).swap(*this)
entspricht .
Beispiel
// std__memory__weak_ptr_operator_as.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
int main()
{
std::shared_ptr<int> sp0(new int(5));
std::weak_ptr<int> wp0(sp0);
std::cout << "*wp0.lock() == " << *wp0.lock() << std::endl;
std::shared_ptr<int> sp1(new int(10));
wp0 = sp1;
std::cout << "*wp0.lock() == " << *wp0.lock() << std::endl;
std::weak_ptr<int> wp1;
wp1 = wp0;
std::cout << "*wp1.lock() == " << *wp1.lock() << std::endl;
return (0);
}
*wp0.lock() == 5
*wp0.lock() == 10
*wp1.lock() == 10
owner_before
Gibt true
zurück, wenn dieses weak_ptr
-Objekt vor dem bereitgestellten Zeiger angeordnet (oder kleiner als dieser) ist.
template <class Other>
bool owner_before(const shared_ptr<Other>& ptr) const noexcept;
template <class Other>
bool owner_before(const weak_ptr<Other>& ptr) const noexcept;
Parameter
ptr
Ein lvalue
-Verweis auf shared_ptr
oder weak_ptr
.
Hinweise
Die Elementfunktion der Vorlage gibt zurück true
, wenn *this
sie vor ptr
geordnet ist.
reset
Gibt die ressource im Besitz frei.
void reset() noexcept;
Hinweise
Die Memberfunktion gibt die Ressource frei, auf *this
die verwiesen wird, und konvertiert sie in ein leeres *this
weak_ptr
Objekt.
Beispiel
// std__memory__weak_ptr_reset.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
int main()
{
std::shared_ptr<int> sp(new int(5));
std::weak_ptr<int> wp(sp);
std::cout << "*wp.lock() == " << *wp.lock() << std::endl;
std::cout << "wp.expired() == " << std::boolalpha
<< wp.expired() << std::endl;
wp.reset();
std::cout << "wp.expired() == " << std::boolalpha
<< wp.expired() << std::endl;
return (0);
}
*wp.lock() == 5
wp.expired() == false
wp.expired() == true
swap
Tauscht zwei weak_ptr
-Objekte.
void swap(weak_ptr& wp) noexcept;
Umfasst auch die Spezialisierung:
template<class T>
void swap(weak_ptr<T>& a, weak_ptr<T>& b) noexcept;
Parameter
wp
Der schwache Zeiger, mit dem getauscht werden soll.
Hinweise
Nach einer swap
, die ursprünglich auf die Ressource verweist, *this
wird wp
von , und die Ressource, auf die ursprünglich durch verwiesen wurde, wird durch .wp
*this
Die Funktion ändert die Verweisanzahl für die beiden Ressourcen nicht und löst keine Ausnahmen aus. Die Auswirkung der Vorlagenspezialisierung ist das Äquivalent von a.swap(b)
.
Beispiel
// std__memory__weak_ptr_swap.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
int main()
{
std::shared_ptr<int> sp1(new int(5));
std::shared_ptr<int> sp2(new int(10));
std::cout << "*sp1 == " << *sp1 << std::endl;
sp1.swap(sp2);
std::cout << "*sp1 == " << *sp1 << std::endl;
swap(sp1, sp2);
std::cout << "*sp1 == " << *sp1 << std::endl;
std::cout << std::endl;
std::weak_ptr<int> wp1(sp1);
std::weak_ptr<int> wp2(sp2);
std::cout << "*wp1 == " << *wp1.lock() << std::endl;
wp1.swap(wp2);
std::cout << "*wp1 == " << *wp1.lock() << std::endl;
swap(wp1, wp2);
std::cout << "*wp1 == " << *wp1.lock() << std::endl;
return (0);
}
*sp1 == 5
*sp1 == 10
*sp1 == 5
*wp1 == 5
*wp1 == 10
*wp1 == 5
use_count
Zählt die Anzahl der shared_ptr
Objekte, die der freigegebenen Ressource gehören.
long use_count() const noexcept;
Hinweise
Die Memberfunktion gibt die Anzahl der shared_ptr
-Objekte zurück, die die Ressource besitzen, auf die von *this
gezeigt wird.
Beispiel
// std__memory__weak_ptr_use_count.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
int main()
{
std::shared_ptr<int> sp1(new int(5));
std::weak_ptr<int> wp(sp1);
std::cout << "wp.use_count() == "
<< wp.use_count() << std::endl;
std::shared_ptr<int> sp2(sp1);
std::cout << "wp.use_count() == "
<< wp.use_count() << std::endl;
return (0);
}
wp.use_count() == 1
wp.use_count() == 2
weak_ptr
Erstellt ein Objekt vom Typ weak_ptr
.
constexpr weak_ptr() noexcept;
weak_ptr(const weak_ptr& wp) noexcept;
weak_ptr(weak_ptr&& wp) noexcept;
template <class Other>
weak_ptr(const weak_ptr<Other>& wp) noexcept;
template <class Other>
weak_ptr(weak_ptr<Other>&& sp) noexcept;
template <class Other>
weak_ptr(const shared_ptr<Other>& sp) noexcept;
Parameter
Other
Der Typ, der vom Argument für den gemeinsamen/schwachen Zeiger gesteuert wird. Diese Konstruktoren nehmen nicht an der Überladungsauflösung teil, es sei denn Other*
, sie sind kompatibel mit element_type*
.
wp
Der zu kopierende schwache Zeiger.
sp
Der zu kopierende gemeinsame Zeiger.
Hinweise
Der Standardkonstruktor erstellt ein leeres weak_ptr
Objekt. Die Konstruktoren, die jeweils ein Argument annehmen, erstellen ein leeres weak_ptr
Objekt, wenn der Argumentzeiger leer ist. Andernfalls erstellen sie ein weak_ptr
Objekt, das auf die vom Argument benannte Ressource verweist. Die Verweisanzahl des freigegebenen Objekts wird nicht geändert.
Beispiel
// std__memory__weak_ptr_construct.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
int main()
{
std::weak_ptr<int> wp0;
std::cout << "wp0.expired() == " << std::boolalpha
<< wp0.expired() << std::endl;
std::shared_ptr<int> sp1(new int(5));
std::weak_ptr<int> wp1(sp1);
std::cout << "*wp1.lock() == "
<< *wp1.lock() << std::endl;
std::weak_ptr<int> wp2(wp1);
std::cout << "*wp2.lock() == "
<< *wp2.lock() << std::endl;
return (0);
}
wp0.expired() == true
*wp1.lock() == 5
*wp2.lock() == 5
~weak_ptr
Beschädigt ein Objekt vom Typ weak_ptr
.
~weak_ptr();
Hinweise
Der Destruktor zerstört dies weak_ptr
, hat jedoch keine Auswirkung auf die Referenzanzahl des Objekts, auf dessen gespeicherten Zeigerpunkte es liegt.