日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

探秘C++標(biāo)準(zhǔn)模板庫中的三種智能指針

來源: 責(zé)編: 時(shí)間:2024-01-24 17:27:42 245觀看
導(dǎo)讀在C++標(biāo)準(zhǔn)模板庫(STL)中有三種智能指針:shared_ptr、unique_ptr和weak_ptr。這三者在現(xiàn)代C++編程中扮演著至關(guān)重要的角色,它們的設(shè)計(jì)旨在管理動(dòng)態(tài)內(nèi)存,并提供更安全、更方便的內(nèi)存管理方式。shared_ptr:共享的智能指針share

在C++標(biāo)準(zhǔn)模板庫(STL)中有三種智能指針:shared_ptr、unique_ptr和weak_ptr。這三者在現(xiàn)代C++編程中扮演著至關(guān)重要的角色,它們的設(shè)計(jì)旨在管理動(dòng)態(tài)內(nèi)存,并提供更安全、更方便的內(nèi)存管理方式。1A428資訊網(wǎng)——每日最新資訊28at.com

1A428資訊網(wǎng)——每日最新資訊28at.com

shared_ptr:共享的智能指針

shared_ptr是一種具有引用計(jì)數(shù)功能的智能指針。當(dāng)多個(gè)shared_ptr指向同一塊內(nèi)存時(shí),它們會(huì)維護(hù)一個(gè)引用計(jì)數(shù),確保在沒有任何指針指向該內(nèi)存時(shí)自動(dòng)釋放。下面是一個(gè)簡單的示例:1A428資訊網(wǎng)——每日最新資訊28at.com

#include <memory>#include <iostream>int main() {    std::shared_ptr<int> shared1 = std::make_shared<int>(42);    std::shared_ptr<int> shared2 = shared1; // 共享所有權(quán)    std::cout << "shared1: " << *shared1 << std::endl; // 輸出:42    std::cout << "shared2: " << *shared2 << std::endl; // 輸出:42    // 引用計(jì)數(shù)減一,但不會(huì)釋放內(nèi)存,因?yàn)槿匀挥幸粋€(gè)shared_ptr指向它    shared1.reset();    std::cout << "shared2: " << *shared2 << std::endl; // 輸出:42    // 當(dāng)最后一個(gè)shared_ptr離開作用域時(shí),引用計(jì)數(shù)為零,內(nèi)存被釋放    return 0;}

shared_ptr的優(yōu)勢在于其能夠方便地共享所有權(quán),但同時(shí)也容易造成循環(huán)引用,因?yàn)樗鼈冎挥性谝糜?jì)數(shù)歸零時(shí)才會(huì)釋放內(nèi)存。這時(shí)就引出了我們接下來要介紹的weak_ptr。1A428資訊網(wǎng)——每日最新資訊28at.com

weak_ptr:破除shared_ptr的循環(huán)引用

weak_ptr是一種不增加引用計(jì)數(shù)的智能指針,通常用于打破shared_ptr的循環(huán)引用。weak_ptr允許你觀察到由shared_ptr管理的對(duì)象,但不擁有它。讓我們看一個(gè)例子:1A428資訊網(wǎng)——每日最新資訊28at.com

#include <memory>#include <iostream>struct Node {    std::shared_ptr<Node> next;};int main() {    std::shared_ptr<Node> node1 = std::make_shared<Node>();    std::shared_ptr<Node> node2 = std::make_shared<Node>();    node1->next = node2;    node2->next = node1; // 引入循環(huán)引用    // 使用weak_ptr打破循環(huán)引用    std::weak_ptr<Node> weakNode1 = node1;    std::weak_ptr<Node> weakNode2 = node2;    // 輸出:2 2,因?yàn)檠h(huán)引用被打破,引用計(jì)數(shù)不再增加    std::cout << "node1 references: " << node1.use_count() << std::endl;    std::cout << "node2 references: " << node2.use_count() << std::endl;    return 0;}

weak_ptr的一個(gè)重要特性是,通過lock()函數(shù)可以將其轉(zhuǎn)換為一個(gè)shared_ptr,以便安全地訪問所指向的對(duì)象。在使用weak_ptr時(shí)要注意,由于它不增加引用計(jì)數(shù),所以在使用前需要檢查對(duì)象是否仍然存在。1A428資訊網(wǎng)——每日最新資訊28at.com

unique_ptr:獨(dú)占所有權(quán)的智能指針

unique_ptr是一種獨(dú)占所有權(quán)的智能指針,它確保在任何時(shí)候只有一個(gè)unique_ptr可以指向給定的對(duì)象。當(dāng)unique_ptr離開作用域時(shí),它所管理的對(duì)象會(huì)被自動(dòng)釋放。讓我們看一個(gè)例子:1A428資訊網(wǎng)——每日最新資訊28at.com

#include <memory>#include <iostream>int main() {    std::unique_ptr<int> unique1 = std::make_unique<int>(42);    // 編譯錯(cuò)誤,因?yàn)閡nique1獨(dú)占了對(duì)內(nèi)存的所有權(quán)    // std::unique_ptr<int> unique2 = unique1;   std::cout << "unique1: " << *unique1 << std::endl; // 輸出:42    // unique1離開作用域,內(nèi)存被釋放    return 0;}

unique_ptr的優(yōu)勢在于它避免了共享所有權(quán)可能引發(fā)的循環(huán)引用問題,并允許更加高效的內(nèi)存管理。然而,由于其獨(dú)占性質(zhì),unique_ptr不適用于所有場景,特別是在需要多個(gè)指針共享同一塊內(nèi)存的情況下。1A428資訊網(wǎng)——每日最新資訊28at.com

總結(jié):三者的聯(lián)系與區(qū)別

在使用這三種智能指針時(shí),我們需要根據(jù)具體的需求來選擇合適的類型。下面是它們的聯(lián)系和區(qū)別的簡要總結(jié):所有權(quán)管理:1A428資訊網(wǎng)——每日最新資訊28at.com

  • shared_ptr:共享所有權(quán),可以由多個(gè)shared_ptr共同管理同一塊內(nèi)存。
  • unique_ptr:獨(dú)占所有權(quán),確保在任何時(shí)候只有一個(gè)unique_ptr可以指向給定的對(duì)象。
  • weak_ptr:不增加引用計(jì)數(shù),用于解決shared_ptr可能引發(fā)的循環(huán)引用問題。

循環(huán)引用處理:1A428資訊網(wǎng)——每日最新資訊28at.com

  • shared_ptr:容易形成循環(huán)引用,需要小心管理。
  • unique_ptr:不涉及循環(huán)引用問題,因?yàn)樗仟?dú)占所有權(quán)的。
  • weak_ptr:用于打破shared_ptr的循環(huán)引用,但需要小心使用,確保在訪問前檢查對(duì)象是否仍然存在。

性能開銷:1A428資訊網(wǎng)——每日最新資訊28at.com

  • shared_ptr:引用計(jì)數(shù)的維護(hù)可能帶來額外的性能開銷。
  • unique_ptr:更加輕量,沒有引用計(jì)數(shù),性能開銷較小。
  • weak_ptr:相對(duì)于shared_ptr來說,性能開銷較小。

在實(shí)際應(yīng)用中,我們可以根據(jù)具體場景的需要,選擇合適的智能指針類型,以獲得更好的內(nèi)存管理和性能表現(xiàn)。1A428資訊網(wǎng)——每日最新資訊28at.com

結(jié)語

在本次的C++探秘中,我們深入了解了shared_ptr、unique_ptr和weak_ptr這三種智能指針。它們分別適用于不同的場景,為我們提供了更安全、更靈活的內(nèi)存管理方式。在實(shí)際編程中,熟練掌握這些智能指針的用法,將有助于提高代碼的可維護(hù)性和安全性。1A428資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-67344-0.html探秘C++標(biāo)準(zhǔn)模板庫中的三種智能指針

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 在Django中自定義字段,你需要知道的所有知識(shí)點(diǎn)!

下一篇: 一文讀懂C++如何實(shí)現(xiàn)多返回值

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 6月iOS設(shè)備好評(píng)榜:第一蟬聯(lián)榜首近一年

    作為安兔兔各種榜單里變化最小的那個(gè),2023年6月的iOS好評(píng)榜和上個(gè)月相比沒有任何排名上的變化,僅僅是部分設(shè)備好評(píng)率的下降,長年累月的用戶評(píng)價(jià)和逐漸退出市場的老款機(jī)器讓這
  • 把LangChain跑起來的三個(gè)方法

    使用LangChain開發(fā)LLM應(yīng)用時(shí),需要機(jī)器進(jìn)行GLM部署,好多同學(xué)第一步就被勸退了,那么如何繞過這個(gè)步驟先學(xué)習(xí)LLM模型的應(yīng)用,對(duì)Langchain進(jìn)行快速上手?本片講解3個(gè)把LangChain跑起來
  • 一文看懂為蘋果Vision Pro開發(fā)應(yīng)用程序

    譯者 | 布加迪審校 | 重樓蘋果的Vision Pro是一款混合現(xiàn)實(shí)(MR)頭戴設(shè)備。Vision Pro結(jié)合了虛擬現(xiàn)實(shí)(VR)和增強(qiáng)現(xiàn)實(shí)(AR)的沉浸感。其高分辨率顯示屏、先進(jìn)的傳感器和強(qiáng)大的處理能力
  • 一年經(jīng)驗(yàn)在二線城市面試后端的經(jīng)驗(yàn)分享

    忠告這篇文章只適合2年內(nèi)工作經(jīng)驗(yàn)、甚至沒有工作經(jīng)驗(yàn)的朋友閱讀。如果你是2年以上工作經(jīng)驗(yàn),請(qǐng)果斷劃走,對(duì)你沒啥幫助~主人公這篇文章內(nèi)容來自 「升職加薪」星球星友 的投稿,坐
  • Java NIO內(nèi)存映射文件:提高文件讀寫效率的優(yōu)秀實(shí)踐!

    Java的NIO庫提供了內(nèi)存映射文件的支持,它可以將文件映射到內(nèi)存中,從而可以更快地讀取和寫入文件數(shù)據(jù)。本文將對(duì)Java內(nèi)存映射文件進(jìn)行詳細(xì)的介紹和演示。內(nèi)存映射文件概述內(nèi)存
  • 阿里瓴羊One推出背后,零售企業(yè)迎數(shù)字化新解

    作者:劉曠近年來隨著數(shù)字經(jīng)濟(jì)的高速發(fā)展,各式各樣的SaaS應(yīng)用服務(wù)更是層出不窮,但本質(zhì)上SaaS大多局限于單一業(yè)務(wù)流層面,對(duì)用戶核心關(guān)切的增長問題等則沒有提供更好的解法。在Saa
  • 小米MIX Fold 3下月亮相:今年唯一無短板的全能折疊屏

    這段時(shí)間以來,包括三星、一加、榮耀等等有不少品牌旗下的最新折疊屏旗艦都有新的進(jìn)展,其中榮耀、三星都已陸續(xù)發(fā)布了最新的折疊屏旗艦,尤其號(hào)榮耀Magi
  • iQOO Neo8 Pro搶先上架:首發(fā)天璣9200+ 安卓性能之王

    經(jīng)過了一段時(shí)間的密集爆料,昨日iQOO官方如期對(duì)外宣布:將于5月23日推出全新的iQOO Neo8系列新品,官方稱這是一款擁有旗艦級(jí)性能調(diào)校的作品。隨著發(fā)布時(shí)
  • 聯(lián)想小新Pad Pro 12.6將要推出,搭載高通驍龍 870 處理器

    聯(lián)想小新Pad Pro 12.6將于秋季新品會(huì)上推出,官方按照慣例直接在發(fā)布會(huì)前給出了機(jī)型的所有參數(shù)。聯(lián)想小新 Pad Pro 12.6 將搭載高通驍龍 870 處理器,重量為 5
Top 主站蜘蛛池模板: 江永县| 丹阳市| 天津市| 西峡县| 城步| 静安区| 长春市| 西吉县| 邓州市| 尚义县| 南靖县| 温泉县| 溆浦县| 来宾市| 安泽县| 台南县| 滨海县| 巴南区| 星座| 中阳县| 万全县| 扎鲁特旗| 福建省| 衡山县| 建瓯市| 如东县| 法库县| 沈阳市| 大姚县| 衡山县| 莲花县| 顺义区| 乐平市| 手游| 闸北区| 清镇市| 景德镇市| 肃北| 凌源市| 新民市| 铜鼓县|