C++中Bitwise Copy带来的问题实例讲解

在对象拷贝过程中,如果没有显示定义默认拷贝构造函数和默认赋值构造函数,编译器会提供相应的缺省函数,该函数是"按位"进行拷贝或者赋值。对于只含有POD成员数据的简单类,bitwise copy方式绰绰有余。但是倘若类比较复杂,类成员中包含有指针、引用、虚函数时会出现错误。

    以类A为例,类A定义如下图所示

    C++中Bitwise Copy带来的问题实例讲解

    假设创建对象a1,a2,a2通过a1拷贝,要是未定义默认拷贝构造函数,则会执行一次构造函数,两次析构函数,如下图所示

   C++中Bitwise Copy带来的问题实例讲解   

   C++中Bitwise Copy带来的问题实例讲解

假设有两个A的对象a1,a2,a1.str2为"hello", a2.str2为"hello1", a2=a1。缺省赋值构造函数会进行“位拷贝”。这时候会造成三个问题:

  1.     a2.str2原有的内存并没有被释放,造成内存泄露
  2.    a2.str2和a1.str2指向同一块内存
  3.    在析构时,str2被释放了两次

如下图所示:

类A添加打印str2地址的方法

C++中Bitwise Copy带来的问题实例讲解

C++中Bitwise Copy带来的问题实例讲解

运行结果如下:

C++中Bitwise Copy带来的问题实例讲解

 

此外以下四种情况,不能用bitwise copy

  1. “带有Copy Constructor”的Member Class Object
  2. “带有Copy Constructor”的Base Class
  3. “带有Virtual Function”的Class
  4. “带有Virtual Base Class”的Class