【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 的实例会在离开作用域时被销毁
}
推荐阅读
- Linux服务器开发|记录一次腾讯c/c++ linux后台开发岗面试经历(面试题含答案)
- C++函数模板的具体化
- LeetCode刷题|recording:24. 两两交换链表中的节点
- C++|大话STL第九期——仿函数(函数对象)
- LeetCode刷题|recording:59.螺旋矩阵II
- SLAM|<<Slam十四讲>> ch13环境安装
- c++|为什么每一名程序员都应该学习 C++()
- opencv从入门到放弃|opencv C艹(色彩空间转换,像素最值,二值化,LUT)
- C++|在路上