C++11 智能指標

來源:互聯網
上載者:User

標籤:

C++沒有提供記憶體回收機制,C++11提供的智能指標能夠在一定程度上解決C++記憶體流失的問題。

C++11提供了共用智能指標(shared_ptr),獨佔智能指標(unique_ptr),弱引用指標指標(weak_ptr),使用時需要引用<memory>

智能指標本質上儲存動態分配(堆)對象的指正的模板類,用於對堆對象的生存期進行控制,確保在離開指標範圍時,能夠自動正確的銷毀動態分配的堆對象,

防止堆記憶體流失。

1. std::shard_ptr通常用於多個智能指標同時使用同一個記憶體資源時,它的內部使用引用計數計數,每次使用它一次,內部引用數增加1;反之,析構一次,引用計數減1;

    減為0時,刪除所指向的堆記憶體。

  1.1初始化:推薦使用make_shared<T>

std::shared_ptr<int> p1(new int(1));  //建構函式初始化auto p2=std::make_shared<int>(1);     //make_shared<T>//std::shared_ptr<int> p2=std::make_shared<int>(1);int *pi=new int(1);std::shard_ptr<int> p3(pi);

 1.2使用方法與普通的原始指標相同

if(p1)  //判斷shared_ptr是否為空白{        std::cout<<"p1 is not null"<<endl;        cout<<*p1<<endl;      //擷取指標指向對象的值
}

int *p=p1.get(); //擷取原始指標

 1.3shared_ptr的最大的一個陷阱是循環參考,循環參考會導致堆記憶體無法正確釋放,導致記憶體流失。

    下面是典型的執行個體,測試表明堆對象並沒有釋放,只是引用計數由2減少為1

#include <iostream>#include <memory>struct A;struct B;struct A{    std::shared_ptr<B> bptr;    A(){std::cout<<"A is created"<<std::endl;}    ~A(){std::cout<<"A is deleted!"<<std::endl;}};struct B{    std::shared_ptr<A> aptr;    B(){std::cout<<"B is created!"<<std::endl;}    ~B(){std::cout<<"B is deleted!"<<std::endl;}};std::weak_ptr<A> wpa;void testPtr(){    std::shared_ptr<A> ap(new A);    std::shared_ptr<B> bp(new B);    ap->bptr=bp;    bp->aptr=ap;    wpa=ap;     //weak_ptr擷取當前觀測資源的引用計數    std::cout<<wpa.use_count()<<std::endl;   //ouput 2}int main(){    testPtr();    std::cout<<wpa.use_count()<<std::endl;  //output 1return 0;}

 2.unique_ptr用於只有一個智能指標管理資源或者管理數組;

   它是一個獨佔型的智能指標,它不予許其他的智能指標共用同一塊記憶體。

   不予許通過賦值將一個unique_ptr給另外一個unique_ptr.

   通過std::move函數轉移堆對象的所有權 

std::unique_ptr<int> ptri1(new int(1));    //std::unique_ptr<int> ptri2=ptri1; // 不能賦值std::unique_ptr<int> ptri2= std::move(ptri1); //轉移所有權//std::cout<<*ptri1<<std::endl; //失去所有權std::cout<<*ptri2<<std::endl; //獲得所有權

 註:unique_ptr除了獨佔性外,unique還可以指向一個數組

//std::shared_ptr<int []> ptr3(new int[10]);

std::unique_ptr<int []> ptr4(new int[10]);
ptr4[9]=9;

3.weak_ptr:用於監視shared_ptr,它不管理shared_ptr內部的指標,

 沒有重載*和->,不共用指標,不能操縱資源。

1)通過use_count(),擷取當前觀測資源的引用計數。執行個體見上

2)通過expired()方法判斷資源是否釋放

    if(wp.expired())

    {

    std::cout<<"not expired!"<<endl;

    }

3)lock()方法可以擷取監視的shared_ptr對象

 

C++11 智能指標

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.