C++|C++11/14之智能指针std::unique_ptr

【C++|C++11/14之智能指针std::unique_ptr】std::unique_ptr 是一种独占的智能指针,它禁止其他智能指针与其共享同一个对象,从而保证了代码的安全:

std::unique_ptr pointer = std::make_unique(10); // make_unique 从 C++14 引入 std::unique_ptr pointer2 = pointer; // 非法

make_unique 并不复杂,C++11 没有提供 std::make_unique,可以自行实现:
template std::unique_ptr make_unique( Args&& ...args ) { return std::unique_ptr( new T( std::forward(args)... ) ); }

至于为什么没有提供,C++ 标准委员会主席 Herb Sutter 在他的博客中提到原因是因为『被他们忘记了』。
既然是独占,换句话说就是不可复制。但是,我们可以利用 std::move 将其转移给其他的 unique_ptr,例如:
#include #include 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 p1(std::make_unique()); // p1 不空, 输出 if (p1) p1->foo(); { std::unique_ptr 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 的实例会在离开作用域时被销毁 }

    推荐阅读