软件开发中有很多处理是对称的,例如打开文件和关闭文件,申请内存和释放内存,压栈和出栈等。同样的道理分享也存在对称处理:独占。与之相应的智能指针就是unique_prt。它同样可以自动管理内存,只是这块内存不和其他的unique_ptr分享。


初始化

如果观察unique_ptr的构造函数声明会发现,unique_ptr支持的构造函数和shared_ptr相差无几,这里直接举例。

初始化空unique_ptr


C++11新特性(42)- 智能指针unique_ptr_初始化


两种写法完全等效。


从指针创建


C++11新特性(42)- 智能指针unique_ptr_赋值_02


这是最普通的初始化方式。


从右值引用创建


C++11新特性(42)- 智能指针unique_ptr_初始化_03


以下是执行结果,可以看到内存从p3转移到了p4。


C++11新特性(42)- 智能指针unique_ptr_赋值_04


赋值

由于unique_ptr对于内存的独占特性,unique_ptr不支持直接的赋值操作,而只能支持右值引用的赋值,基本形式如下:


C++11新特性(42)- 智能指针unique_ptr_C++_05


必须是先前的持有者明确放弃权利之后,才能赋值给新的持有者。实际的程序中,上面的代码并没有太大的意义,真正常见的应该是下面的代码:


C++11新特性(42)- 智能指针unique_ptr_赋值_06


C++11新特性(42)- 智能指针unique_ptr_初始化_07


getvalue函数返回的是一个右值,所以也会执行右值引用赋值。

最后说一句话


从函数从返回unique_ptr的时候涉及到一个例外:即将销毁的unique_ptr可以被拷贝或赋值。


觉得本文有帮助?请分享给更多人。

阅读更多更新文章,关注微信公众号【面向对象思考】

C++11新特性(42)- 智能指针unique_ptr_C++_08