此頭文件是動態內存管理庫的一部分。std::weak_ptr
是一種智能指針,它持有對被 std::shared_ptr 管理的對象的非擁有性(“弱”)引用。在訪問所引用的對象前必須先轉換為 std::shared_ptr。std::weak_ptr
用來表達臨時所有權的概念:當某個對象只有存在時才需要被訪問,而且隨時可能被他人刪除時,可以使用 std::weak_ptr
來跟蹤該對象。需要獲得臨時所有權時,則將其轉換為 std::shared_ptr,此時如果原來的 std::shared_ptr 被銷毀,則該對象的生命期將被延長至這個臨時的 std::shared_ptr 同樣被銷毀為止。std::weak_ptr
的另一用法是打斷 std::shared_ptr 所管理的對象組成的環狀引用。若這種環被孤立(例如無指向環中的外部共享指針),則 shared_ptr
引用計數無法抵達零,而內存被泄露。可通過令環中的指針之一為弱指針來避免這種情況。
成員函數
(構造函數) | 構造新的 weak_ptr (公開成員函數) |
(析構函數) | 銷毀 weak_ptr (公開成員函數) |
operator= | 為 weak_ptr 賦值(公開成員函數) |
修改器 | |
reset | 釋放被管理對象的所有權 (公開成員函數) |
swap | 交換被管理對象 (公開成員函數) |
觀察器 | |
use_count | 返回管理該對象的 shared_ptr 對象數量(公開成員函數) |
expired | 檢查被引用的對象是否已刪除 (公開成員函數) |
lock | 創建管理被引用的對象的 shared_ptr (公開成員函數) |
owner_before | 提供弱指針的基于擁有者的排序 (公開成員函數) |
示例代碼:
#include <iostream>
#include <memory>struct C3 { int* data; };int main()
{// weak_ptr constructor examplestd::shared_ptr<int> sp(new int);std::weak_ptr<int> wp0;std::weak_ptr<int> wp1(wp0);std::weak_ptr<int> wp2(sp);// weak_ptr use_count examplestd::cout << "use_count:\n";std::cout << "wp0: " << wp0.use_count() << '\t';std::cout << "wp1: " << wp1.use_count() << '\t';std::cout << "wp2: " << wp2.use_count() << '\n';// weak_ptr::operator= examplestd::shared_ptr<int> sp1, sp2;std::weak_ptr<int> wp;// sharing group:// --------------sp1 = std::make_shared<int>(10); // sp1wp = sp1; // sp1, wpsp2 = wp.lock(); // sp1, wp, sp2sp1.reset(); // wp, sp2sp1 = wp.lock(); // sp1, wp, sp2std::cout << "*sp1: " << *sp1 << '\t';std::cout << "*sp2: " << *sp2 << '\n';// weak_ptr::reset examplestd::shared_ptr<int> sp3(new int(10));std::weak_ptr<int> wp3(sp3);std::cout << "1. wp3 " << (wp3.expired() ? "is" : "is not") << " expired\n";wp3.reset();std::cout << "2. wp3 " << (wp3.expired() ? "is" : "is not") << " expired\n";// weak_ptr::swap examplestd::shared_ptr<int> sp4(new int(10));std::shared_ptr<int> sp5(new int(20));std::weak_ptr<int> wp4(sp4);std::weak_ptr<int> wp5(sp5);wp4.swap(wp5);std::cout << "sp4 -> " << *sp4 << '\t';std::cout << "sp5 -> " << *sp5 << '\n';std::cout << "wp4 -> " << *wp4.lock() << '\t';std::cout << "wp5 -> " << *wp5.lock() << '\n';// weak_ptr::expired examplestd::shared_ptr<int> shared(new int(10));std::weak_ptr<int> weak(shared);std::cout << "1. weak " << (weak.expired() ? "is" : "is not") << " expired\n";shared.reset();std::cout << "2. weak " << (weak.expired() ? "is" : "is not") << " expired\n";// weak_ptr::lock examplestd::shared_ptr<int> sp6, sp7;std::weak_ptr<int> wp6;// sharing group:// --------------sp6 = std::make_shared<int>(20); // sp6wp6 = sp6; // sp6, wp6sp7 = wp6.lock(); // sp6, wp6, sp7sp6.reset(); // wp6, sp7sp6 = wp6.lock(); // sp6, wp6, sp7std::cout << "*sp6: " << *sp6 << '\n';std::cout << "*sp7: " << *sp7 << '\n';// weak_ptr::owner_beforeint *p8 = new int(10);std::shared_ptr<int> a(new int(20));std::shared_ptr<int> b(a, p8); // alias constructorstd::weak_ptr<int> c(b);std::cout << "comparing a and c...\n" << std::boolalpha;std::cout << "value-based: " << (!(a < c.lock()) && !(c.lock() < a)) << '\n';std::cout << "owner-based: " << (!a.owner_before(c) && !c.owner_before(a)) << '\n';delete p8;return 0;
}
運行效果:
參考:
https://cplusplus.com/reference/memory/weak_ptr/
std::weak_ptr - cppreference.com