900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > Cpp 对象模型探索 / 深浅拷贝

Cpp 对象模型探索 / 深浅拷贝

时间:2024-06-28 23:44:41

相关推荐

Cpp 对象模型探索 / 深浅拷贝

-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!)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。