智能指針unique_ptr的使用

定義

template<class T, class Deleter = std::default_delete<T>> class unique_ptr;
template <class T, class Deleter> 
class unique_ptr<T[], Deleter>;

std::unique_ptr 是經過指針佔有並管理另外一對象, 並在unique_ptr離開做用域時釋放該對象的智能指針。算法

釋放對象的時機-> :數組

  1. 銷燬了管理的unique_ptr對象
  2. 經過operator=reset() 賦值另外一指針給管理的 unique_ptr對象

也能夠經過調用get_deleter()(ptr) 刪除對象;ide

unique_ptr 是能夠轉義對象的管理權的,可是被const修飾以後就不可以被轉移了函數

經常使用的成員函數

函數名字 做用
operator= 賦值
reset 替換被管理對象
swap 交換被管理對象
release 返回被管理對象的指針,而且釋放一個對象全部權
get 返回被管理對象的指針

經常使用的非成員函數

函數名字 做用
make_unique 建立一個管理對象的獨佔指針
std::swap(std::unique_ptr) 特化 std::swap 算法

示例代碼

struct Base {
    // 建立一個虛函數
    virtual void bar() { std::cout << "Base::bar()\n"; }
    virtual ~Base() = default;
    
    std::string val;
};

struct Derived : Base {
    Derived() { std::cout << "Derived::Constructor\n"; }
    ~Derived() { std::cout << "Derived::Descontructor\n"; }
    void bar() override { std::cout << "Derived::bar()\n"; }

    std::string val;
};

int main()
{
    std::cout << "\nunique_ptr 指向對象的全部權的測試---->\n";
    {
        // ptr_Derived擁有對象的全部權
        auto ptr_Derived = std::make_unique<Derived> ();
        ptr_Derived->val = "unique_ptr";
        auto ptr_MoveD = std::move(ptr_Derived);    //ptr_Derived 不在擁有對象全部權

        assert(!ptr_Derived);    //ptr_Derived爲empty
        ptr_MoveD->bar();
        std::cout << ptr_MoveD->val << std::endl;
        // 這裏將會調用一次Derived的析構函數
    }

    std::cout << "\n多態運行時測試----->\n";
    {
        std::unique_ptr<Base> p_base = std::make_unique<Derived>();    // p_base是指向基類的指針,可是佔有D的unique_ptr
        p_base->bar();    // 這裏將調用的Derived的bar函數

        std::vector<std::unique_ptr<Base>> v;    // 容器也能夠存儲unique_ptr對象

        v.push_back(std::move(p_base));
        v.push_back(std::make_unique<Derived>());
        v.emplace_back(new Derived);

        for (auto& itr : v)
        {
            itr->bar();
        }

        // 這裏將調用3次析構函數 
    }

    std::cout << "\n數組形式的unique_str對象測試--->\n";
    {
        std::unique_ptr<Derived[]> parr{ new Derived[4] };
        // 這裏將調用4次析構函數
    }
    return 0;
}

運行結果

unique_ptr 指向對象的全部權的測試---->
Derived::Constructor
Derived::bar()
unique_ptr
Derived::Descontructor

多態運行時測試----->
Derived::Constructor
Derived::bar()
Derived::Constructor
Derived::Constructor
Derived::bar()
Derived::bar()
Derived::bar()
Derived::Descontructor
Derived::Descontructor
Derived::Descontructor

數組形式的unique_str對象測試--->
Derived::Constructor
Derived::Constructor
Derived::Constructor
Derived::Constructor
Derived::Descontructor
Derived::Descontructor
Derived::Descontructor
Derived::Descontructor
相關文章
相關標籤/搜索