C++11 shared_ptr概念及用法


基本概念

  • shared_ptr 是C++11提供的一種智能指針類,主要用於消除內存泄漏和懸空指針的問題,方便資源的管理,自動釋放沒有指針引用的資源.
  • shared_ptr的大小是原始指針的兩倍,因為它的內部有一個原始指針指向資源,同時有個指針指向引用計數.

所在庫

C++11模板庫

#include <memory>
shared_ptr<T> ptr(new T);  // T 可以是 int、char、類等各種類型

GNU G++ 的標准庫中還沒有支持,需使用boost

#include <boost/shared_ptr.hpp>

內存

每個 shared_ptr 對象在內部指向兩個內存位置

  • 指向對象的指針
  • 用於控制引用計數數據的指針

計數變化規則

  • 當新的 shared_ptr 對象與指針關聯時,則在其構造函數中,將與此指針關聯的引用計數增加1。
  • 當任何 shared_ptr 對象超出作用域時,則在其析構函數中,它將關聯指針的引用計數減1。如果引用計數變為0,則表示沒有其他 shared_ptr 對象與此內存關聯,在這種情況下,它使用delete函數刪除該內存
  • 引用計數加一/減一操作是原子性的,所以線程安全的
    使用以下方法可檢查 shared_ptr 對象的引用計數
ptr.use_count(); 

構造方法

(1)使用空參數構造函數構造

std::shared_ptr<T> ptr;

這樣構造的話,ptr 的意義就相當於一個 NULL 指針。當試圖在一個空指針上做類似於 *ptr 或者 ptr->xx 之類的東西的時候,會出現異常錯誤
(2)直接從 new 操作符的返回值構造

std::shared_ptr<T> ptr(new T()); //引用計數加 1

(3) 使用make_shared方法

std::shared_ptr<T> p1=std::make_shared<T> (); //引用計數加 1

(4)復制構造函數

std::shared_ptr<T> ptr2(ptr1);    // 這就是使用復制構造函數的方法,引用計數加 1

shared_ptr 可以當作函數的參數傳遞,或者當作函數的返回值返回,這個時候其實也相當於使用復制構造函數。
過程如下:作函數實參時,將指針執行復制構造函數傳入函數體內,因此該內存塊的引用計數+1;
當作為函數返回值時,復制構造函數將內存地址傳遞給新指針,引用計數+1,然后,局部指針執行析構,引用計數-1。

參考鏈接

智能指針之共享指針shared_ptr 的理解、使用(全)
C++11 std::shared_ptr總結與使用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM