-04-19 创建人:Ruo_Xiao开发环境:VS邮箱:xclsoftware@
一、定义
浅拷贝:仅仅是对两个指针变量中的内容进行了赋值,即:两个指针指向的是同一个内存区域。深拷贝:将一个指针按照另一个指针进行申请内存,即:两个指针指向的是不同的内存区域。二、分析
#include <iostream>class CA{public:CA(){p_ = new int[3]();}CA(const CA& obj){p_ = new int[3]();memcpy(p_,obj.p_,sizeof(int)*3);}~CA(){if (p_ != nullptr){delete[]p_;p_ = nullptr;}}public:int *p_;};int main(){CA obj1;CA obj2(obj1);std::cout << "obj1.p_ = " << obj1.p_ << std::endl;std::cout << "obj2.p_ = " << obj2.p_ << std::endl;std::cin.get();return 0;}
结果如下:
obj1.p_ = 010EF130obj2.p_ = 010EF280
若将 CA 中 CA(const CA &obj) 函数去掉,其结果如下:
obj1.p_ = 00CEEFA8obj2.p_ = 00CEEFA8
分析:
上述代码中,类 CA 中不存在显式的拷贝构造函数,当执行CA obj2(obj1); 代码时,编译器会执行 bitwise copy ,即:按位拷贝(浅拷贝)。也就是编译器并不会创建拷贝构造函数,仅仅是逐位的就把 obj1里面的数据拷贝到了 obj2 中。验证方法是执行dumpbin /all test1.obj > test1.txt 指令,在 test1.txt 中全局搜索 “CA::CA”,并没有发现 CA::CA(const CA &) 相关的内容,故编译器没有创建拷贝构造函数。
浅拷贝的问题就在于 obj1 中的 p_和 obj2 中的 p_指向的内存是相同的,其中一个执行了析构函数,另外一个执行析构函数是就会报错。
而类 CA 中显示定义的拷贝构造函数,则是深拷贝,因为不单单拷贝了指针的内容,还把指针指向的内容进行了拷贝。这种深度拷贝在 obj1 和 obj2 释放时是安全的。
(SAW:Game Over!)