国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

深入理解和應(yīng)用C++ std::shared_ptr別名構(gòu)造函數(shù)

這篇具有很好參考價(jià)值的文章主要介紹了深入理解和應(yīng)用C++ std::shared_ptr別名構(gòu)造函數(shù)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

深入理解和應(yīng)用C++ std::shared_ptr別名構(gòu)造函數(shù)

引言

在現(xiàn)代C++中,智能指針是一個(gè)極為重要的工具,尤其std::shared_ptr以其自動(dòng)內(nèi)存管理、引用計(jì)數(shù)和多線程安全性等特性深受開(kāi)發(fā)者喜愛(ài)。其中一個(gè)不太常用但功能強(qiáng)大的構(gòu)造方式是別名構(gòu)造函數(shù),它允許我們創(chuàng)建一個(gè)共享相同底層對(duì)象但是指向其內(nèi)部不同數(shù)據(jù)成員或子對(duì)象的新shared_ptr。本文將探討這個(gè)特性,并通過(guò)實(shí)例說(shuō)明其在復(fù)雜類型管理和資源控制中的應(yīng)用場(chǎng)景。

一、std::shared_ptr及其別名構(gòu)造函數(shù)簡(jiǎn)介

std::shared_ptr是一種智能指針,采用引用計(jì)數(shù)機(jī)制來(lái)自動(dòng)管理所指向的對(duì)象生命周期。當(dāng)沒(méi)有更多shared_ptr指向同一塊動(dòng)態(tài)分配的內(nèi)存時(shí),該內(nèi)存會(huì)被自動(dòng)釋放。

template<typename Other>
shared_ptr(const shared_ptr<Other>& r, T* ptr);

此構(gòu)造函數(shù)接受兩個(gè)參數(shù):一個(gè)是另一個(gè)shared_ptr實(shí)例,另一個(gè)是指向原始shared_ptr管理對(duì)象內(nèi)的某個(gè)成員或子對(duì)象的指針。新生成的shared_ptr會(huì)共享第一個(gè)參數(shù)的引用計(jì)數(shù)器,但其自身指向的是指定的成員地址。

二、別名構(gòu)造函數(shù)的實(shí)際應(yīng)用場(chǎng)景

下面通過(guò)一個(gè)具體的例子來(lái)闡述std::shared_ptr的別名構(gòu)造函數(shù)如何用于處理復(fù)雜類型:

#include <memory>
#include <iostream>
// 定義一個(gè)自定義結(jié)構(gòu)體
struct MyData {
    int a;
    int b;
};

std::ostream& operator<<(std::ostream& out, const MyData &data) {
    out << "a = " << data.a << ", b = " << data.b;
    return out;
}

int main()
{
    // 創(chuàng)建一個(gè)指向MyData結(jié)構(gòu)體對(duì)象的shared_ptr
    std::shared_ptr<MyData> sptr1(new MyData{10, 20});

    // 使用別名構(gòu)造創(chuàng)建一個(gè)新的shared_ptr,它共享sptr1的引用計(jì)數(shù),
    // 但其內(nèi)部指針指向sptr1所管理的對(duì)象的a成員
    int* memberPtr = &sptr1->b;
    std::shared_ptr<int> sptr3(sptr1, memberPtr);

    std::cout << "sptr1:" << sptr1 << ", use_count:" << sptr1.use_count() << ", get():" << sptr1.get() << ", *sptr1:" << *sptr1 << std::endl;
    std::cout << "sptr3:" << sptr3 << ", use_count:" << sptr3.use_count() << ", get():" << sptr3.get() << ", *sptr3:" << *sptr3<< std::endl;

    // 此時(shí),改變通過(guò)sptr3訪問(wèn)的值會(huì)影響到原始對(duì)象
    *sptr3 = 30;
    std::cout << sptr1->b << std::endl; // 輸出:30

    return 0;
}
sptr1:0x7f9f5fc02aa0, use_count:2, get():0x7f9f5fc02aa0, *sptr1:a = 10, b = 20
sptr3:0x7f9f5fc02aa4, use_count:2, get():0x7f9f5fc02aa4, *sptr3:20
30

在這個(gè)場(chǎng)景中,盡管sptr3僅指向MyData結(jié)構(gòu)體的單個(gè)整型成員b,但它同樣參與了整個(gè)MyData對(duì)象生命周期的管理。因此,即使我們?cè)诓僮鱯ptr3時(shí),也間接地影響到了原始MyData對(duì)象的狀態(tài)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-792220.html

到了這里,關(guān)于深入理解和應(yīng)用C++ std::shared_ptr別名構(gòu)造函數(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • C++之weak_ptr與shared_ptr智能指針實(shí)例(一百九十五)

    C++之weak_ptr與shared_ptr智能指針實(shí)例(一百九十五)

    簡(jiǎn)介: CSDN博客專家,專注Android/Linux系統(tǒng),分享多mic語(yǔ)音方案、音視頻、編解碼等技術(shù),與大家一起成長(zhǎng)! 優(yōu)質(zhì)專欄: Audio工程師進(jìn)階系列 【 原創(chuàng)干貨持續(xù)更新中…… 】?? 人生格言: 人生從來(lái)沒(méi)有捷徑,只有行動(dòng)才是治療恐懼和懶惰的唯一良藥. 更多原創(chuàng),歡迎關(guān)注:An

    2024年02月09日
    瀏覽(24)
  • 【C++入門到精通】智能指針 shared_ptr 簡(jiǎn)介及C++模擬實(shí)現(xiàn) [ C++入門 ]

    【C++入門到精通】智能指針 shared_ptr 簡(jiǎn)介及C++模擬實(shí)現(xiàn) [ C++入門 ]

    在 C++ 動(dòng)態(tài)內(nèi)存管理中,除了 auto_ptr 和 unique_ptr 之外,還有一種 智能指針 shared_ptr ,它可以讓多個(gè)指針共享同一個(gè)動(dòng)態(tài)資源,并且能夠自動(dòng)釋放資源。 shared_ptr 通過(guò)引用計(jì)數(shù)的方式來(lái)管理內(nèi)存,能夠避免程序中出現(xiàn)懸空指針和內(nèi)存泄漏等問(wèn)題 。本文將介紹 shared_ptr 的簡(jiǎn)介和

    2024年01月22日
    瀏覽(16)
  • 智能指針shared_ptr

    shared_ptr共享它指向的對(duì)象,內(nèi)部采用計(jì)數(shù)機(jī)制來(lái)實(shí)現(xiàn)。當(dāng)新的shared_ptr與對(duì)象關(guān)聯(lián)時(shí),引用計(jì)數(shù)加1;當(dāng)shared_ptr超出作用域時(shí),引用計(jì)數(shù)減1;當(dāng)引用計(jì)數(shù)為0時(shí),釋放該對(duì)象; shared_ptrA p0 = std::make_sharedA(\\\"西紅柿\\\");//C++11提供 重載了*和-操作符,可以像使用指針一樣使用shared_ptr

    2023年04月23日
    瀏覽(34)
  • shared_ptr和unique_ptr主動(dòng)釋放

    shared_ptr和unique_ptr均可以采用reset()來(lái)進(jìn)行釋放,unique_ptr調(diào)用了reset之后就會(huì)直接釋放掉,shared_ptr則會(huì)在所有引用計(jì)數(shù)變?yōu)?的時(shí)候才會(huì)釋放申請(qǐng)的內(nèi)存。 注意unique_ptr的release()方法,并不會(huì)釋放資源,只會(huì)把unique_ptr置為空指針,原來(lái)那個(gè)資源可以繼續(xù)調(diào)用 reset 結(jié)果: 在reset之

    2024年02月14日
    瀏覽(19)
  • 論 shared_ptr的線程安全

    今天有同事問(wèn)我shared_ptr是線程更安全的嗎?我當(dāng)時(shí)腦子一懵,有點(diǎn)不確定。 但回過(guò)神來(lái)仔細(xì)一想這什么鳥問(wèn)題,c++ stl里有線程安全的嗎,shared_ptr 也不是針對(duì)線程安全而設(shè)計(jì)出來(lái)的呀,八竿子打不著的東西為什么會(huì)湊在一起問(wèn)。 好像也就一個(gè)atmoic引用計(jì)數(shù)可以沾上邊。 首先

    2024年02月08日
    瀏覽(19)
  • C++11 新特性 ⑥ | 智能指針 unique_ptr、shared_ptr 和 weak_ptr

    目錄 1、引言 2、unique_ptr 3、shared_ptr 4、weak_ptr 5、shared_ptr循環(huán)引用問(wèn)題(面試題)

    2024年02月09日
    瀏覽(27)
  • C++11中的智能指針unique_ptr、shared_ptr和weak_ptr詳解

    C++11中的智能指針unique_ptr、shared_ptr和weak_ptr詳解

    目錄 1、引言 2、什么是智能指針? 3、在Visual Studio中查看智能指針的源碼實(shí)現(xiàn) 4、獨(dú)占式指針unique_ptr 4.1、查看unique_ptr的源碼實(shí)現(xiàn)片段 4.2、為什么unique_ptr的拷貝構(gòu)造函數(shù)和復(fù)制函數(shù)被delete了?(面試題) 4.3、使用unique_ptr獨(dú)占式智能指針的實(shí)例 5、共享式指針shared_ptr? 5.1、查

    2024年02月08日
    瀏覽(19)
  • 面試之快速學(xué)習(xí)C++11-完美轉(zhuǎn)發(fā),nullptr, shared_ptr,unique_ptr,weak_ptr,shared_from_this

    函數(shù)模版可以將自己的參數(shù)完美地轉(zhuǎn)發(fā)給內(nèi)部調(diào)用的其他函數(shù)。所謂完美,即不僅能準(zhǔn)確地轉(zhuǎn)發(fā)參數(shù)的值,還能保證被轉(zhuǎn)發(fā)參數(shù)的左右值屬性不變 引用折疊:如果任一引用為左值引用,則結(jié)果為左值引用,否則為右值引用。 上述 T 為int 。 那么整個(gè)為 int - int 回到完美轉(zhuǎn)發(fā),

    2024年02月12日
    瀏覽(16)
  • c++ std::enable_shared_from_this作用

    c++ std::enable_shared_from_this作用

    std::enable_shared_from_this 是一個(gè)類模板,用來(lái)返回指向當(dāng)前對(duì)象的shared_ptr智能指針。在說(shuō)明它的作用前我們可以看一下如下代碼: demo.cpp 類 A 中有一個(gè)函數(shù) getSharedPtr() 函數(shù),用來(lái)返回指向當(dāng)前對(duì)象的一個(gè)shared智能打針。其實(shí)就是用 this 構(gòu)造了一個(gè)智能指針進(jìn)行返回,執(zhí)行結(jié)果

    2023年04月23日
    瀏覽(25)
  • 深入理解 C++ 語(yǔ)法:從基礎(chǔ)知識(shí)到高級(jí)應(yīng)用

    讓我們將以下代碼分解以更好地理解它: 示例 示例解釋 第 1 行: #include iostream 是一個(gè)頭文件庫(kù),它讓我們可以使用輸入和輸出對(duì)象,比如 cout (在第 5 行使用)。頭文件為 C++ 程序添加功能。 第 2 行: using namespace std 表示我們可以使用標(biāo)準(zhǔn)庫(kù)中的對(duì)象和變量名稱。 如果你

    2024年03月23日
    瀏覽(21)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包