默认移动构造函数
来源:互联网 发布:tower for windows 编辑:程序博客网 时间:2024/05/11 14:35
我认为编译器合成的移动构造函数只完成成员的移动,而不会把指针成员置空,eg:
先不定义移动构造函数,使用编译器合成的移动构造。
#include <iostream>using namespace std;class A{public:A(int *ptr=new int):p(ptr){}int *p;};int main(){ A a1(new int(4));A a2(std::move(a1));cout<<a1.p<<endl;return 0;}
结果
说明编译器没有把成员指针p置空。
再看我们自己定义的移动构造函数:
class A{public:A(int *ptr=new int):p(ptr){}A(A &&a):p(a.p)//本人猜测合成的移动构造函数只完成这一步,而函数体是空的{a.p=nullptr;}int *p;};
同上main函数,执行结果:
同时从这里我们也可以隐隐推断,为甚我们定义了自己的拷贝构造,拷贝赋值运算符,析构函数后,编译器不会帮我们合成移动构造函数,因为,如果我们定义了这些操作往往表示类内含有指针成员需要动态分配内存,如果需要为类定义移动操作,那么应该确保移动后源对象是安全的,但是默认的移动构造函数不会帮我们把指针成员置空,移后源不是可析构的安全状态,如果这样,当离开移动构造后,源对象被析构,对象内的指针成员空间被回收,转移之后对象内的指针成员出现悬垂现象,程序将引起致命的错误。所以当我们定义了自己的拷贝操作和析构函数时,编译器是不会帮我们合成默认移动构造函数的。
0 0
- 默认移动构造函数
- 默认移动构造函数
- C++类的特殊成员-默认/拷贝/移动构造函数
- 默认构造函数
- 使用默认构造函数
- C++ 默认构造函数
- 关于默认构造函数
- C++ 默认构造函数
- 默认构造函数
- 默认构造函数
- 默认构造函数
- 关于默认构造函数
- 默认构造函数
- C++ 默认构造函数
- C++ 默认构造函数
- 默认构造函数
- C++默认构造函数
- 创建默认构造函数
- rabbitmq技术的一些感悟(二)
- 2014-08-19 19:28:13
- 依赖注入 javax.inject中@Inject、@Named、@Qualifier和@Provider用法
- ADF开发初体验之二:使用EJB、JPA、JSF开发Web应用
- hdu 2242 无向图/求用桥一分为二后使俩个bcc点权值和之差最小并输出 /缩点+2次新图dfs
- 默认移动构造函数
- hibernate做无限极菜单树如此简单
- android 模拟器连接不上的问题
- HDOJ 4970 Killing Monsters
- 开发ADF桌面应用
- ibatis
- C++学习笔记4 C++之bool类型
- 页面初次Load时是否调用了查询方法?
- HDU 4960 Another OCD Patient 区间dp