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 的實例會在離開作用域時被銷燬
}