搜尋

首頁  >  問答  >  主體

c++ - 使用智能指针管理动态内存

在《c++ primer》这本书中看到,两种智能指针管理内存:

shared_ptr<int> sp (new int[10],[](int*p){delete[] p;}):

unique_ptr<int[]> up (new int[10]);

为什么使用shared_ptr的时候不需要指明int[]而可以使用int呢?

巴扎黑巴扎黑2772 天前475

全部回覆(2)我來回復

  • 大家讲道理

    大家讲道理2017-04-17 14:54:35

    uniqe_ptr up(new int),之後刪除的時候會delete。
    uniqe_ptr up(new int[10]),之後刪除的時候會delete []。

    錯誤搭配將導致錯誤。

    而shared_ptr定標準的時候,沒人想到要給shared_ptr template加一個陣列的specialization。所以shared_ptr呼叫delete[]的實作不存在。

    shared_ptr sp(new int[10]),之後刪除的時候會用delete而不是delete [],會導致錯誤。

    你必須告訴shared_ptr怎麼刪除這個數組,就是後面那個[](int*p){delete[] p;}),沒有這個,delete的時候會出錯。

    為何shared_ptr訂標準的時候沒加上呢?因為他們忘了/懶/沒人寫出一個proposal出來,大概這樣吧。

    其實陣列的unique_ptr和shared_ptr並不是很常見,直接用vector不就好了。 。

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 14:54:35

    @hearts 說得已經比較全面了,補充一點。

    大多數情況下直接使用vector就好,標準函式庫已經優化得很好了。但是shared_ptrunique_ptr並不是沒有用處,特別是在多態時,具體見C++ Primer面對對象程式設計那一節,shared_ptrunique_ptr還有之前得auto_ptr都是為了取代裸指針【危險】,實際情況中應該說shared_ptr用得比較少,unique_ptr常用一些。

    當然無論是vector還是*_ptr都是為了RAII,這又是另一個好玩的話題了。

    一些淺見,請多指教。

    回覆
    0
  • 取消回覆