基本概念
- 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。