C++中Bitwise Copy带来的问题实例讲解
在对象拷贝过程中,如果没有显示定义默认拷贝构造函数和默认赋值构造函数,编译器会提供相应的缺省函数,该函数是"按位"进行拷贝或者赋值。对于只含有POD成员数据的简单类,bitwise copy方式绰绰有余。但是倘若类比较复杂,类成员中包含有指针、引用、虚函数时会出现错误。
以类A为例,类A定义如下图所示
假设创建对象a1,a2,a2通过a1拷贝,要是未定义默认拷贝构造函数,则会执行一次构造函数,两次析构函数,如下图所示
假设有两个A的对象a1,a2,a1.str2为"hello", a2.str2为"hello1", a2=a1。缺省赋值构造函数会进行“位拷贝”。这时候会造成三个问题:
- a2.str2原有的内存并没有被释放,造成内存泄露
- a2.str2和a1.str2指向同一块内存
- 在析构时,str2被释放了两次
如下图所示:
类A添加打印str2地址的方法
运行结果如下:
此外以下四种情况,不能用bitwise copy
- “带有Copy Constructor”的Member Class Object
- “带有Copy Constructor”的Base Class
- “带有Virtual Function”的Class
- “带有Virtual Base Class”的Class