weak_ptr
Klasa
Otacza słabo połączony wskaźnik.
Składnia
template<class T> class weak_ptr;
Parametry
T
Typ kontrolowany przez słaby wskaźnik.
Uwagi
Szablon klasy opisuje obiekt wskazujący zasób zarządzany przez co najmniej jeden shared_ptr
obiekt. Obiekty weak_ptr
wskazujące zasób nie mają wpływu na liczbę odwołań zasobu. Gdy ostatni shared_ptr
obiekt zarządzający tym zasobem zostanie zniszczony, zasób zostanie zwolniony, nawet jeśli istnieją weak_ptr
obiekty wskazujące ten zasób. Takie zachowanie jest niezbędne do uniknięcia cykli w strukturach danych.
weak_ptr
Obiekt wskazuje zasób, jeśli został skonstruowany z shared_ptr
obiektu, który jest właścicielem tego zasobu, jeśli został skonstruowany z obiektu wskazującego weak_ptr
ten zasób, lub jeśli ten zasób został przypisany do niego za pomocą operator=
polecenia . Obiekt weak_ptr
nie zapewnia bezpośredniego dostępu do zasobu, do którego wskazuje. Kod, który musi używać zasobu, wykonuje to za pośrednictwem obiektu, który jest właścicielem shared_ptr
tego zasobu, utworzony przez wywołanie funkcji lock
składowej . weak_ptr
Obiekt wygasł, gdy zasób, na który wskazuje, został uwolniony, ponieważ wszystkie shared_ptr
obiekty będące właścicielem zasobu zostały zniszczone. Wywołanie lock
obiektu weak_ptr
, który wygasł, powoduje utworzenie pustego shared_ptr
obiektu.
Pusty weak_ptr
obiekt nie wskazuje żadnych zasobów i nie ma bloku kontrolnego. Funkcja składowa lock
zwraca pusty shared_ptr
obiekt.
Cykl występuje, gdy co najmniej dwa zasoby kontrolowane przez shared_ptr
obiekty przechowują wzajemnie odwołujące shared_ptr
się do obiektów. Na przykład lista połączona cykliczna z trzema elementami ma węzeł N0
główny ; ten węzeł zawiera shared_ptr
obiekt, który jest właścicielem następnego węzła, N1
; ten węzeł zawiera obiekt, który jest właścicielem shared_ptr
następnego węzła; N2
z kolei ten węzeł zawiera shared_ptr
obiekt, który jest właścicielem węzła głównego, N0
, zamykając cykl. W takiej sytuacji liczba odwołań nigdy nie staje się równa zero, a węzły w cyklu nigdy nie są zwalniane. Aby wyeliminować cykl, ostatni węzeł N2
powinien przechowywać weak_ptr
obiekt wskazujący N0
zamiast shared_ptr
obiektu. weak_ptr
Ponieważ obiekt nie jest właścicielemN0
, nie ma wpływu na N0
liczbę odwołań, a ostatnie odwołanie programu do węzła głównego zostanie zniszczone węzły na liście.
Elementy członkowskie
Nazwa/nazwisko | opis |
---|---|
Konstruktory | |
weak_ptr |
Tworzy element weak_ptr . |
Destruktory | |
~weak_ptr |
Niszczy element weak_ptr . |
Definicje typów | |
element_type |
Typ elementu. |
Funkcje składowe | |
expired |
Sprawdza, czy własność wygasła. |
lock |
Uzyskuje wyłączną własność zasobu. |
owner_before |
Zwraca wartość true , jeśli jest to weak_ptr uporządkowane przed (lub mniejszym) podanym wskaźnikiem. |
reset |
Wydania należące do zasobu. |
swap |
Zamienia dwa weak_ptr obiekty. |
use_count |
Zlicza liczbę shared_ptr obiektów. |
Operatory | |
operator= |
Zastępuje zasób będący własnością. |
element_type
Typ elementu.
typedef T element_type; // through C++17
using element_type = remove_extent_t<T>; // C++20
Uwagi
Typ jest synonimem parametru T
szablonu .
Przykład
// 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
Sprawdza, czy własność wygasła, oznacza to, że odwołany obiekt został usunięty.
bool expired() const noexcept;
Uwagi
Funkcja składowa zwraca true
wartość , jeśli *this
wygasła, w przeciwnym razie false
.
Przykład
// 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
Uzyskuje własność shared_ptr
zasobu, który współdzieli własność zasobu.
shared_ptr<T> lock() const noexcept;
Uwagi
Funkcja składowa zwraca pusty shared_ptr
obiekt, jeśli *this
wygasł; w przeciwnym razie zwraca obiekt, który jest właścicielem shared_ptr<T>
zasobu, *this
do którego wskazuje. Zwraca wartość równoważną niepodzielnemu wykonaniu expired() ? shared_ptr<T>() : shared_ptr<T>(*this)
elementu .
Przykład
// 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=
Zastępuje zasób będący własnością.
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;
Parametry
Other
Typ kontrolowany przez argument współużytkowany lub słaby wskaźnik.
ptr
Słaby wskaźnik lub wskaźnik udostępniony do skopiowania.
Uwagi
Wszystkie operatory zwalniają zasób wskazywany obecnie przez *this
i przypisz własność zasobu o nazwie ptr
do *this
. Jeśli operator ulegnie awarii, pozostanie *this
niezmieniony. Każdy operator ma efekt odpowiadający weak_ptr(ptr).swap(*this)
.
Przykład
// 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
Zwraca wartość true
, jeśli jest to weak_ptr
uporządkowane przed (lub mniejszym) podanym wskaźnikiem.
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;
Parametry
ptr
Odwołanie lvalue
do elementu shared_ptr
lub .weak_ptr
Uwagi
Funkcja składowa szablonu zwraca true
wartość , jeśli *this
jest uporządkowana przed ptr
.
reset
Zwalnia należący do niego zasób.
void reset() noexcept;
Uwagi
Funkcja składowa zwalnia zasób wskazywany przez *this
i konwertuje *this
go na pusty weak_ptr
obiekt.
Przykład
// 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
Zamienia dwa weak_ptr
obiekty.
void swap(weak_ptr& wp) noexcept;
Obejmuje również specjalizację:
template<class T>
void swap(weak_ptr<T>& a, weak_ptr<T>& b) noexcept;
Parametry
wp
Słaby wskaźnik do zamiany.
Uwagi
Po obiekcie swap
zasób pierwotnie wskazywany przez *this
element jest wskazywany przez wp
element , a zasób pierwotnie wskazywany przez wp
element jest wskazywany przez *this
element . Funkcja nie zmienia liczby odwołań dla dwóch zasobów i nie zgłasza żadnych wyjątków. Efektem specjalizacji szablonu jest odpowiednik a.swap(b)
.
Przykład
// 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
Zlicza liczbę shared_ptr
obiektów, które są właścicielem zasobu udostępnionego.
long use_count() const noexcept;
Uwagi
Funkcja składowa zwraca liczbę shared_ptr
obiektów będących właścicielem zasobu wskazywanego przez *this
element .
Przykład
// 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
Tworzy element 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;
Parametry
Other
Typ kontrolowany przez argument współużytkowany/słaby wskaźnik. Te konstruktory nie uczestniczą w rozwiązywaniu przeciążeń, chyba że Other*
jest zgodny z element_type*
.
wp
Słaby wskaźnik do skopiowania.
sp
Wskaźnik udostępniony do skopiowania.
Uwagi
Domyślny konstruktor tworzy pusty weak_ptr
obiekt. Konstruktory, które przyjmują argument, każdy konstruuje pusty weak_ptr
obiekt, jeśli wskaźnik argumentu jest pusty. W przeciwnym razie tworzą weak_ptr
obiekt wskazujący zasób o nazwie argumentu. Liczba odwołań obiektu udostępnionego nie jest zmieniana.
Przykład
// 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
Niszczy element weak_ptr
.
~weak_ptr();
Uwagi
Destruktor niszczy to weak_ptr
, ale nie ma wpływu na liczbę odwołań obiektu, w którym znajduje się jego przechowywany wskaźnik.