小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

智能指針shared

 wtkc 2014-10-25

  shared_ptr的作用有如同指針,但會(huì)記錄有多少個(gè)shared_ptrs共同指向一個(gè)對(duì)象。這便是所謂的引用計(jì)數(shù)(reference counting)。一旦最后一個(gè)這樣的指針被銷毀,也就是一旦某個(gè)對(duì)象的引用計(jì)數(shù)變?yōu)?,這個(gè)對(duì)象會(huì)被自動(dòng)刪除。shared_ptr 在 Technique report I 中已經(jīng)出現(xiàn),在effective C++ 中提到過shared_ptr 的使用,現(xiàn)在已經(jīng)成為C++11 的正式成員。shared_ptr 的自動(dòng)刪除功能是一個(gè)很好的防止內(nèi)存泄露的方法,在C++中也稱為RAII(Resource Acquisition Is Initialization)。RAII 的一般做法是這樣的:在對(duì)象構(gòu)造時(shí)獲取資源,接著控制對(duì)資源的訪問使之在對(duì)象的生命周期內(nèi)始終保持有效,最后在對(duì)象析構(gòu)的時(shí)候釋放資源。借此,我們實(shí)際上把管理一份資源的責(zé)任托管給了一個(gè)對(duì)象。這種做法有兩大好處:1,我們不需要顯式地釋放資源。2,采用這種方式,對(duì)象所需的資源在其生命期內(nèi)始終保持有效 —— 我們可以說,此時(shí)這個(gè)類維護(hù)了一個(gè) invariant。這樣,通過該類對(duì)象使用資源時(shí),就不必檢查資源有效性的問題,可以簡化邏輯、提高效率。

下面來看一個(gè)簡單的例子,涵蓋了shared_ptr的基本操作:

復(fù)制代碼
#include <memory> 
#include <iostream> 
 
int main() 
{ 
    auto sp1 = std::make_shared<int>(5);
    std::cout << "sp1.unique() == " << std::boolalpha << sp1.unique() << std::endl; 

    std::shared_ptr<int> sp2 = sp1; 
    std::cout << "sp1.unique() == " << std::boolalpha << sp1.unique() << std::endl;

    std::cout << "sp1.use_count(): "<< sp1.use_count()<<std::endl;
    std::cout << "sp2.use_count(): "<< sp2.use_count()<<std::endl;

    std::cout <<"sp1.get(): "<<sp1.get()<<std::endl;
    std::cout <<"sp2.get(): "<<sp2.get()<<std::endl;

    sp1.reset();
    
    std::cout << "sp1.use_count(): "<< sp1.use_count()<<std::endl;
    std::cout << "sp2.use_count(): "<< sp2.use_count()<<std::endl;

    std::shared_ptr<int> sp3(new int(10));
    std::cout <<"*sp2: "<< *sp2 <<std::endl;
    std::cout <<"*sp3: "<< *sp3 <<std::endl;    
    sp2.swap(sp3);
    std::cout <<"After swap: "<<std::endl;
    std::cout <<"*sp2: "<< *sp2 <<std::endl;
    std::cout <<"*sp3: "<< *sp3 <<std::endl;    

}
復(fù)制代碼

運(yùn)行結(jié)果:

C:\Windows\system32\cmd.exe /c shared_ptr.exe
sp1.unique() == true
sp1.unique() == false
sp1.use_count(): 2
sp2.use_count(): 2
sp1.get(): 001FBEEC
sp2.get(): 001FBEEC
sp1.use_count(): 0
sp2.use_count(): 1
*sp2: 5
*sp3: 10
After swap:
*sp2: 10
*sp3: 5
Hit any key to close this window...

說明:unique 函數(shù) 判斷該指針的引用計(jì)數(shù)是否為1,use_count() 函數(shù)返回該指針的引用計(jì)數(shù),get()函數(shù)返回該指針的值,reset()清除該指針的引用計(jì)數(shù),swap()函數(shù)交換兩個(gè)指針的值。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多