std:move() 作用 和 移动语义后 右值行为,unique_ptr的"移动"操作问题
2024-09-01 16:20:50
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
最新文章
- Hello session
- 用iMindMap如何提高我们绩效
- ASP.NET MVC搭建项目后台UI框架—6、客户管理(添加、修改、查询、分页)
- windows phone 存储图片 数据库写法
- jetbrick,新一代 Java 模板引擎,具有高性能和高扩展性
- mysql TIMESTAMP详解
- 工作中用到的linux命令
- 自己主动更新--下载apk以及提示对话框的实现(3)
- 自写jquery网页回到顶部效果,渐隐图标,引用js文件就可以
- javascript如何解析json对javascript如何解析json对象并动态赋值到select列表象并动态赋值到select列表
- canvas实现画板功能(渐变、动画、阴影...)
- Java继承多态中的方法访问权限控制
- Android开发之启动模式的深入理解
- cocos2d-x-3.x 学习总结(一)
- os x下如何挂载iso镜像
- 洛谷 P1027 【Car的旅行路线】
- jQuery.prop , jQuery.attr ,jQuery.data
- CODEFORCES掉RATING记 #2
- 在Ubuntu上搭建IntelliJ IDEA license server服务器
- 51单片机SRF寄存器
热门文章
- eclipse使用小记录
- 发现Mapstruct的一个bug
- 串口应用:遵循uart协议发送N位数据(状态优化为3个,适用任意长度的输入数据,取寄存器中的一段(用变量作为边界))
- 关于canvas的图片获取及python处理
- JAVA基础-11-Java Number 类--九五小庞
- Veux mapState、mapGetters、mapActions、mapMutations &;&; Vuex命名空间
- WindTerm:新一代开源免费的终端工具,GitHub星标6.6k+,太酷了!
- 任意N阶幻方算法实现
- 使用fontforge修改字体,只保留数字
- 让 DolphinScheduler 1.3.4 开启 Netty 日志打印,解决流程实例一直在运行中的问题