unique_ptr 不能进行赋值操作,但是可以有返回unique_ptr的函数,由此产生的问题:

结论1:std:move() 只是将一个实参强行转换为右值引用。

我们知道对象初始化时有 构造函数拷贝构造函数移动构造函数;其中移动构造函数能够防止拷贝过程,减小性能开销;

1.拷贝构造函数通常使用赋值运算可以触发,如T a=b;

2.而移动构造函数需要使用右值引用来赋值,因此通常需要搭配std:move()使用
  T a=std:move(b);或者T a = func(); 其中func() 一个返回T类型的函数;

举个例子:

 1 #include <iostream>
2 #include <memory>
3 using namespace std;
4
5 class A {
6 public:
7 A() {
8 cout << "构造函数" << endl;
9 }
10 A(const A& a) {
11 cout << "拷贝构造" << endl;
12 }
13 A(A&& a) {
14 cout << "移动构造" << endl;
15 }
16 virtual ~A() {}
17 };
18
19 A func(A a){
20 cout<<"func body"<<endl;
21 return a;
22 }
23
24 int main() {
25 A a;
26 cout<<endl;
27 A b=a;
28 cout<<endl;
29 A c=move(a);
30 cout<<endl;
31 A d=func(a);
32 return 0;
33 }

运行结果:

构造函数

拷贝构造

移动构造

拷贝构造
func body
移动构造

结论2:那么在移动语义后右值将会如何呢,答案是调用析构函数销毁。

  如 T a =std:move(b); 语句后 b将被销毁。

举个例子:

 1 #include <iostream>
2 #include <memory>
3 using namespace std;
4 int main() {
5 unique_ptr<int> ptr1(new int(10));
6 unique_ptr<int> ptr2=move(ptr1);
7 if(ptr1==nullptr)
8 cout<<"ptr1==null "<<endl;
9 //cout<<*ptr1<<endl; //引发段错误,已析构
10 cout <<&ptr1 << endl << &ptr2 << endl;
11 return 0;
12 }

运行结果:

1 ptr1==null
2 0x7fffd55dc548
3 0x7fffd55dc550

最新文章

  1. Hello session
  2. 用iMindMap如何提高我们绩效
  3. ASP.NET MVC搭建项目后台UI框架—6、客户管理(添加、修改、查询、分页)
  4. windows phone 存储图片 数据库写法
  5. jetbrick,新一代 Java 模板引擎,具有高性能和高扩展性
  6. mysql TIMESTAMP详解
  7. 工作中用到的linux命令
  8. 自己主动更新--下载apk以及提示对话框的实现(3)
  9. 自写jquery网页回到顶部效果,渐隐图标,引用js文件就可以
  10. javascript如何解析json对javascript如何解析json对象并动态赋值到select列表象并动态赋值到select列表
  11. canvas实现画板功能(渐变、动画、阴影...)
  12. Java继承多态中的方法访问权限控制
  13. Android开发之启动模式的深入理解
  14. cocos2d-x-3.x 学习总结(一)
  15. os x下如何挂载iso镜像
  16. 洛谷 P1027 【Car的旅行路线】
  17. jQuery.prop , jQuery.attr ,jQuery.data
  18. CODEFORCES掉RATING记 #2
  19. 在Ubuntu上搭建IntelliJ IDEA license server服务器
  20. 51单片机SRF寄存器

热门文章

  1. eclipse使用小记录
  2. 发现Mapstruct的一个bug
  3. 串口应用:遵循uart协议发送N位数据(状态优化为3个,适用任意长度的输入数据,取寄存器中的一段(用变量作为边界))
  4. 关于canvas的图片获取及python处理
  5. JAVA基础-11-Java Number 类--九五小庞
  6. Veux mapState、mapGetters、mapActions、mapMutations &amp;&amp; Vuex命名空间
  7. WindTerm:新一代开源免费的终端工具,GitHub星标6.6k+,太酷了!
  8. 任意N阶幻方算法实现
  9. 使用fontforge修改字体,只保留数字
  10. 让 DolphinScheduler 1.3.4 开启 Netty 日志打印,解决流程实例一直在运行中的问题