【原】C++ 11智能指標之unique_ptr

來源:互聯網
上載者:User
    unique_ptr是一個獨享所有權的智能指標,它提供了一種嚴格語義上的所有權,包括:    1、擁有它所指向的對象。    2、無法進行複製構造,也無法進行複製賦值操作。也就是說,我們無法得到指向同一個對象的兩個unique_ptr。但是可以進行移動構造和移動賦值操作。    3、儲存指向某個對象的指標,當它本身被刪除釋放的時候(比如,離開了某個範圍),會使用給定的刪除器釋放它指向的對象。    使用unique_ptr,可以實現以下功能,包括:    1、為動態申請的記憶體提供異常安全。    2、將動態申請記憶體的所有權傳遞給某個函數。    3、從某個函數返回動態申請記憶體的所有權。    4、在容器中儲存指標。    5、所有auto_ptr應該具有的(但無法在C++ 03中實現的)功能。    下面是一段傳統的會產生不安全異常的代碼:

1 X* f()2 {3     X* p = new X;4     // 做一些事情,可能會拋出某個異常5    return p;6 }
    解決方案是,使用unique_ptr來管理這個對象的所有權,由其進行這個對象的釋放工作。

1 X* f()2 {3      unique_ptr<X> p(new X);4      // 做一些事情,可能會拋出異常5     return p.release();6 }
    如果程式執行過程中拋出了異常,unique_ptr就會釋放它所指向的對象。但是,除非我們真的需要返回一個內建的指標,我們還可以返回一個unique_ptr。

1 unique_ptr<X> f()2 {3       unique_ptr<X> p(new X);4       // 做一些事情,可能會拋出異常5     return p;6 }
    現在,我們可以這樣使用函數f():

1 void g()2 {3        unique_ptr<X> q = f();              // 使用移動建構函式(move constructor)4      q->DoSomething();                   // 使用q5        X x = *q;                                  // 複製指標q所指向的對象6 }    // 在函數退出的時候,q以及它所指向的對象都被刪除釋放
    unique_ptr具有移動語意,所以我們可以使用函數f()返回的右值對q進行初始化,這樣就簡單地將所有權傳遞給了q。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.