念两句诗

千古斜阳,无处问长安。
【宋代】张舜民《江神子·癸亥陈和叔会于赏心亭》
随笔 - 12,  文章 - 1,  评论 - 0,  阅读 - 2436

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

 

posted on   昔九  阅读(508)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示