weak_ptr
類別
包裝弱式連結的指標。
語法
template<class T> class weak_ptr;
參數
T
弱式指標所控制的類型。
備註
類別範本描述指向一或多個 shared_ptr
物件所管理之資源的物件。 weak_ptr
指向資源的物件不會影響資源的參考計數。 當管理該資源的最後一個 shared_ptr
對象終結時,即使有 weak_ptr
指向該資源的物件,也會釋放資源。 此行為對於避免數據結構中的迴圈至關重要。
weak_ptr
如果物件是從shared_ptr
擁有該資源的物件所建構,則物件會指向資源,如果是從weak_ptr
指向該資源的 物件建構,或使用該資源指派給該operator=
資源,則為 。 weak_ptr
物件不會提供指向之資源的直接存取權。 需要使用資源的程式代碼會透過 shared_ptr
擁有該資源的物件,藉由呼叫成員函式 lock
所建立。 weak_ptr
物件在指向的資源已釋出時已過期,因為擁有資源的所有shared_ptr
物件都已終結。 在已過期的物件上weak_ptr
呼叫 lock
會建立空白shared_ptr
物件。
空 weak_ptr
的 物件不會指向任何資源,而且沒有控制區塊。 其成員函式 lock
會傳回空 shared_ptr
的物件。
當由 shared_ptr
物件控制的兩個或多個資源保留對 shared_ptr
物件的交互參考時,就會發生循環。 例如,一個具有三個項目的循環連結清單會有前端節點 N0
;該節點保留擁有下一個節點 (N1
) 的 shared_ptr
物件;而保留 shared_ptr
物件的該節點又擁有下一個節點 (N2
);該節點會依序保留擁有前端節點 (N0
) 的 shared_ptr
物件,並關閉此循環。 在此情況下,參考計數永遠不會變成零,而且迴圈中的節點永遠不會釋放。 若要消除循環,則最後一個節點 N2
應該保留指向 N0
的 weak_ptr
物件,而不是 shared_ptr
物件。 weak_ptr
因為物件並不擁有N0
它不會影響N0
的參考計數,而且當程式最後一個對前端節點的參考被終結時,清單中的節點也會被終結。
成員
名稱 | 描述 |
---|---|
建構函式 | |
weak_ptr |
建構 weak_ptr 。 |
解構函式 | |
~weak_ptr |
終結 weak_ptr 。 |
Typedefs | |
element_type |
項目的類型。 |
成員函式 | |
expired |
測試擁有權是否已到期。 |
lock |
取得資源的獨佔擁有權。 |
owner_before |
如果這個 weak_ptr 排序在所提供的指標之前 (或小於),則傳回 true 。 |
reset |
釋放所擁有的資源。 |
swap |
交換兩個 weak_ptr 物件。 |
use_count |
計算物件的數目 shared_ptr 。 |
運算子 | |
operator= |
取代所擁有的資源。 |
element_type
項目的類型。
typedef T element_type; // through C++17
using element_type = remove_extent_t<T>; // C++20
備註
此類型是範本參數 T
的同義字。
範例
// 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
測試擁有權是否已過期,也就是已刪除參考的物件。
bool expired() const noexcept;
備註
如果 *this
已過期則成員函式傳回 true
,否則為 false
。
範例
// 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
shared_ptr
取得共享資源擁有權的 。
shared_ptr<T> lock() const noexcept;
備註
如果*this
已過期,成員函式會傳回空白shared_ptr
物件,否則會傳回shared_ptr<T>
擁有指向之資源的 *this
物件。 傳回相當於 不可部分完成執行的值 expired() ? shared_ptr<T>() : shared_ptr<T>(*this)
。
範例
// 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=
取代所擁有的資源。
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;
參數
Other
由自變數共用或弱式指標所控制的類型。
ptr
要複製的弱式指標或共享指標。
備註
運算子都會釋放目前所指向 *this
的資源,並將所命名 ptr
資源的擁有權指派給 *this
。 如果運算子失敗,則會維持 *this
不變。 每個運算子的效果相當於 weak_ptr(ptr).swap(*this)
。
範例
// 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
如果這個 weak_ptr
排序在所提供的指標之前 (或小於),則傳回 true
。
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;
參數
ptr
針對 shared_ptr
或 weak_ptr
的 lvalue
參考。
備註
如果 *this
是在 之前ptr
排序,則樣本成員函式會true
傳回 。
reset
釋放擁有的資源。
void reset() noexcept;
備註
成員函式會釋放 所 *this
指向的資源,並轉換成 *this
空白 weak_ptr
物件。
範例
// 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
交換兩個 weak_ptr
物件。
void swap(weak_ptr& wp) noexcept;
也包含特製化:
template<class T>
void swap(weak_ptr<T>& a, weak_ptr<T>& b) noexcept;
參數
wp
要交換的弱式指標。
備註
swap
之後,原本指向的資源會wp
由 所指向*this
,而原本指向的資源會由 所指向wp
*this
。 函式不會變更兩個資源的參考計數,也不會擲回任何例外狀況。 樣板特製化的效果相當於 a.swap(b)
。
範例
// 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
計算擁有共用資源的物件數目 shared_ptr
。
long use_count() const noexcept;
備註
成員函式會傳回擁有 *this
所指向之資源的 shared_ptr
物件數目。
範例
// 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
建構 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;
參數
Other
引數共用/弱式指標所控制的類型。 除非 Other*
與 element_type*
相容,否則這些建構函式不會參與多載解析。
wp
要複製的弱式指標。
sp
要複製的共用指標。
備註
默認建構函式會建構空 weak_ptr
的物件。 如果自變數指標是空的,則採用自變數的每個建構函式都會建構空 weak_ptr
的物件。 否則,他們會建構 weak_ptr
指向 自變數所命名之資源的物件。 共用對象的參考計數不會變更。
範例
// 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
終結 weak_ptr
。
~weak_ptr();
備註
解構函式會終結這個 , weak_ptr
但不會影響其所儲存指標指向之對象的參考計數。