C++11/14介紹(五)——智能指針和引用計數(三)

std::unique_ptr

std::unique_ptr 是一種獨佔的智能指針,它禁止其他智能指針與其共享同一個對象,從而保證了代碼的安全:

std::unique_ptr<int> pointer = std::make_unique<int>(10);   // make_unique 從 C++14 引入
std::unique_ptr<int> pointer2 = pointer;    // 非法

既然是獨佔,換句話說就是不可複製。但是可以利用 std::move 將其轉移給其他的 unique_ptr,ex:

#include <iostream>
#include <memory>

struct Foo {
    Foo()      { std::cout << "Foo::Foo" << std::endl;  }
    ~Foo()     { std::cout << "Foo::~Foo" << std::endl; }
    void foo() { std::cout << "Foo::foo" << std::endl;  }
};

void f(const Foo &) {
    std::cout << "f(const Foo&)" << std::endl;
}

int main() {
    std::unique_ptr<Foo> p1(std::make_unique<Foo>());

    // p1 不空, 輸出
    if (p1) p1->foo();
    {
        std::unique_ptr<Foo> p2(std::move(p1));

        // p2 不空, 輸出
        f(*p2);

        // p2 不空, 輸出
        if(p2) p2->foo();

        // p1 爲空, 無輸出
        if(p1) p1->foo();

        p1 = std::move(p2);

        // p2 爲空, 無輸出
        if(p2) p2->foo();
        std::cout << "p2 被銷燬" << std::endl;
    }
    // p1 不空, 輸出
    if (p1) p1->foo();

    // Foo 的實例會在離開作用域時被銷燬
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章