memory動態內存管理學習之weak_ptr

此頭文件是動態內存管理庫的一部分。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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/37879.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/37879.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/37879.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

three.js實現雪花場景效果

點擊獲取雪花圖片素材 提取碼:lywa // 雪花效果 import * as THREE from "three" export function getsnowEffect(th) {console.log(th, th) // this 場景var that th// 創建一個BufferGeometry對象&#xff0c;用于存儲頂點數據 const geometry new THREE.Buffe…

Vim神兵:精通自定義補全規則

標題&#xff1a;Vim神兵&#xff1a;精通自定義補全規則 摘要 Vim作為Linux上最強大的文本編輯器之一&#xff0c;其補全功能可以極大提高編碼效率。本文將詳細探討如何在Vim中自定義補全規則&#xff0c;包括基本的補全設置、使用Vim腳本擴展補全功能&#xff0c;以及如何利…

大模型微調實戰之基于星火大模型的群聊對話分角色要素提取挑戰賽:Task01:跑通Baseline

目錄 0 背景1 環境配置1.1 下載包1.2 配置密鑰1.3 測試模型 2 解決問題2.1 獲取數據2.2 設計Prompt2.2 設計處理函數2.3 開始提取 附全流程代碼 0 背景 Datawhale AI夏令營第二期開始啦&#xff0c;去年有幸參與過第一期&#xff0c;收獲很多&#xff0c;這次也立馬參與了第二…

VMware ESXi 技術

目錄 一、VMware ESXi安裝 1. 在VMware WorkStation中創建一臺虛擬機 2. 進入VMware ESXi控制臺 3. 配置VMware ESXi網絡 二、使用Web網頁端登錄管理ESXi 1. 分配許可證密鑰&#xff08;選做&#xff09; 2. 管理ESXi 三、VMware ESXi控制臺 1. 創建虛擬機 2. 定制虛擬…

Webpack: 開發 PWA、Node、Electron 應用

概述 毋庸置疑&#xff0c;對前端開發者而言&#xff0c;當下正是一個日升月恒的美好時代&#xff01;在久遠的過去&#xff0c;Web 頁面的開發技術鏈條非常原始而粗糙&#xff0c;那時候的 JavaScript 更多用來點綴 Web 頁面交互而不是用來構建一個完整的應用。直到 2009年5月…

LINUX操作系統:Mx Linux,用虛擬機VMware Workstation安裝體驗

需求說明&#xff1a; 操作系統目前流行有Windows、Linux、Unix等&#xff0c;中國人應該要知道國有操作系統&#xff0c;也要支持國產操作系統&#xff0c;為了更好支持國產操作系統&#xff0c;我們也要知己知彼&#xff0c;那么今天就來體驗一把操作系統Mx_Linux_23.2的安裝…

分享一個下載windows系統鏡像包的網站

下載各種操作系統&#xff08;比如Windows、Linux、MacOS等&#xff09;比較快的鏡像站點&#xff0c;我嘗試過這個不錯&#xff0c;提供了BT連接&#xff0c;可以用迅雷軟件下載&#xff0c;速度很快的&#xff01; 入口地址&#xff1a;NEXT, ITELLYOU 1&#xff09;打開網站…

[XYCTF新生賽2024] pwn

用了一周來復現crypto部分(不能算是復現&#xff0c;拿著 糖醋小雞塊的WP一點點學了下)。 兩天時間復現PWN部分。相對來說PWN比密碼這塊要簡單&#xff0c;不過ARM,MIPS懶得學了&#xff0c;跳過。 malloc_flag 題目先打開flag將建0x100的塊&#xff0c;然后把flag讀入再fre…

[深度學習] Transformer

Transformer是一種深度學習模型&#xff0c;最早由Vaswani等人在2017年的論文《Attention is All You Need》中提出。它最初用于自然語言處理&#xff08;NLP&#xff09;任務&#xff0c;但其架構的靈活性使其在許多其他領域也表現出色&#xff0c;如計算機視覺、時間序列分析…

MySQL高級-SQL優化- limit優化(覆蓋索引加子查詢)

文章目錄 0、limit 優化0.1、從表 tb_sku 中按照 id 列進行排序&#xff0c;然后跳過前 9000000 條記錄0.2、通過子查詢獲取按照 id 排序后的第 9000000 條開始的 10 條記錄的 id 值&#xff0c;然后在原表中根據這些 id 值獲取對應的完整記錄 1、上傳5個sql文件到 /root2、查看…

libctk shared library的設計及編碼實踐記錄

一、引言 1.1 <libctk>的由來 1.2 <libctk>的設計理論依據 1.3 <libctk>的設計理念 二、<libctk>的依賴庫 三、<libctk>的目錄說明 四、<libctk>的功能模塊及使用實例說明 4.1 日志模塊 4.2 mysql client模塊 4.3 ftp client模塊 4…

鴻蒙開發設備管理:【@ohos.geolocation (位置服務)】

位置服務 說明&#xff1a; 本模塊首批接口從API version 7開始支持。后續版本的新增接口&#xff0c;采用上角標單獨標記接口的起始版本。 導入模塊 import geolocation from ohos.geolocation;geolocation.on(‘locationChange’) on(type: ‘locationChange’, request: L…

安卓開發自定義時間日期顯示組件

安卓開發自定義時間日期顯示組件 問題背景 實現時間和日期顯示&#xff0c;左對齊和對齊兩種效果&#xff0c;如下圖所示&#xff1a; 問題分析 自定義view實現一般思路&#xff1a; &#xff08;1&#xff09;自定義一個View &#xff08;2&#xff09;編寫values/attrs.…

poi-tl 生成 word 文件(插入文字、圖片、表格、圖表)

文章說明 本篇文章主要通過代碼案例的方式&#xff0c;展示 poi-tl 生成 docx 文件的一些常用操作&#xff0c;主要涵蓋以下內容 &#xff1a; 插入文本字符&#xff08;含樣式、超鏈接&#xff09;插入圖片插入表格引入標簽&#xff08;通過可選文字的方式&#xff0c;這種方…

俄羅斯防空系統

俄羅斯的S系列防空系統是一系列先進的地對空導彈系統&#xff0c;旨在防御各類空中威脅&#xff0c;包括飛機、無人機、巡航導彈和彈道導彈。以下是幾種主要的S系列防空系統&#xff1a; 1. **S-300系統**&#xff1a; - **S-300P**&#xff1a;最早期的版本&#xff0c;用…

翻譯造句練習

翻譯練習 翻譯 1&#xff1a;經常做運動會提高人的自信 翻譯 2&#xff1a;教學的質量對學生成績有很大的影響。 翻譯 3&#xff1a;家長和老師應該努力去減少小孩看電視的時間。 翻譯 4&#xff1a;經濟的下滑&#xff08;economic slowdown&#xff09;導致失業率的上升 翻譯…

大模型和數據庫最新結合進展

寫在前面 本文主要內容是上次接受 infoQ 訪談&#xff0c;百度智能云朱潔老師介紹了大模型和 AI 結合相關話題&#xff0c;這次整體再刷新下&#xff0c;給到對這個領域感興趣的同學。 當前&#xff0c;百度智能云云數據庫特惠專場開始&#xff01;熱銷規格新用戶免費使用&am…

Android中ViewModel+LiveData+DataBinding的配合使用(kotlin)

Android 中 ViewModel、LiveData 和 Data Binding 的配合使用&#xff08;Kotlin&#xff09; 摘要 本文將介紹如何在 Android 開發中結合使用 ViewModel、LiveData 和 Data Binding 進行數據綁定和狀態更新。我們將詳細探討這三者之間的關系&#xff0c;并展示如何在 Kotlin…

最逼真的簡易交通燈設計

最逼真的簡易交通燈設計 需要資料的請在文章末尾獲取&#xff08;有問題可以私信我哦~~&#xff09; 01 資料內容 Proteus仿真文件程序源碼實物制作&#xff0c;代碼修改&#xff0c;功能定制&#xff08;需額外收費&#xff0c;價格實惠&#xff0c;歡迎咨詢&#xff09; …

實驗場:在幾分鐘內使用 Elasticsearch 進行 RAG 應用程序實驗

作者&#xff1a;來自 Elastic Joe McElroy, Serena Chou 什么是 Playground&#xff08;實驗場&#xff09;&#xff1f; 我們很高興發布我們的 Playground 體驗 —- 一個低代碼界面&#xff0c;開發人員可以在幾分鐘內使用自己的私人數據探索他們選擇的 LLM。 在對對話式搜…