c++11智能指針std::unique_ptr

智能指針std::unique_ptr
std::unique_ptr
1.特性

1) 任意時刻unique_ptr只能指向某一個對象,指針銷燬時,指向的對象也會被刪除(通過內置刪除器,通過調用析構函數實現刪除對象)
2)禁止拷貝和賦值(底層實現拷貝構造函數和複製構造函數 = delete),可以使用std::move()、unique_ptr.reset(…) 轉移對象指針控制權。

(由1決定,指針發生了拷貝就違反了第一條)

2.怎麼實現禁止拷貝構造和賦值構造?

拷貝構造 和 賦值符‘=’ 對應函數 被刪除了,所以用不了。
在這裏插入圖片描述
可以在IDE/編輯器中查看詳細實現:
在這裏插入圖片描述
我們可以看到,拷貝和賦值函數被禁止實現(禁用)了。

更加詳細的內容參閱cppreference:

① std :: unique_ptr 構造

② 賦值

#include <iostream>
#include <memory>
using namespace std;

// unique_ptr::get vs unique_ptr::release
int main() 
{
    std::unique_ptr<int> foo; //foo - null
    std::unique_ptr<int> bar; //bar - null
    int* p = nullptr;
    foo = std::unique_ptr<int>(new int(100));// foo - 100
    bar = std::move(foo); // foo轉移給bar bar - 100 foo - null
    p = bar.get(); // p - 100 smart pointer.get()返回一個指向該對象的內置指針
    foo.reset(bar.release()); // bar 放棄指針控制權,返回指針給foo foo - 100, bar已經不存在

    cout << "foo : " << *foo << endl;
    cout << "p   : " << *p << endl;
    delete p; //記得刪除,這也是使用智能指針的初衷之一---防止內存泄漏!!!

    if (bar)
        cout << "bar : " << *bar << endl;
    else
        cout << "bar已經被釋放" << endl; //這裏bar已經銷燬了,可能會報錯。

    return 0;
}

轉載至:https://www.cnblogs.com/yocichen/p/10561615.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章