Cpp 对象模型探索 / 深浅拷贝
2018-04-19 创建人:Ruo_Xiao
开发环境:VS2019
邮箱:xclsoftware@163.com
一、定义
- 浅拷贝:仅仅是对两个指针变量中的内容进行了赋值,即:两个指针指向的是同一个内存区域。
- 深拷贝:将一个指针按照另一个指针进行申请内存,即:两个指针指向的是不同的内存区域。
二、分析
#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_ = 010EF130
obj2.p_ = 010EF280
若将 CA 中 CA(const CA &obj) 函数去掉,其结果如下:
obj1.p_ = 00CEEFA8
obj2.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!)
Cpp 对象模型探索 / 深浅拷贝相关推荐
- Cpp 对象模型探索 / 拷贝构造函数 和 赋值构造函数 的调用时机
class A { public:A() {};A(const A& obj) {}A& operator=(const A& obj) { return *this; } } ...
- Cpp 对象模型探索 / 单一继承的类的内存布局
目录 1.父类和子类都没有虚函数 2.父类有虚函数.子类没有虚函数 3.父类没有虚函数,子类有虚函数 4.父类和子类都有虚函数 5.总结 #include <iostream> class ...
- Cpp 对象模型探索 / 成员初始化列表
目录 一.何时必须使用? 二.优势 三.细节探究 一.何时必须使用? 成员变量是 const 类型. 成员变量是引用. 基类中含有带形参的构造函数且不存在默认的构造函数. 成员变量是类对象,该对象含有 ...
- Cpp 对象模型探索 / 程序转化语义
一.定义时初始化 源码 #include <iostream> using namespace std;class A { public:A(){std::cout << &q ...
- Cpp 对象模型探索 / 含有虚基类的类的内存布局
一.栗子 class Grand { public:int i_grand_ = 8; };class Parent1 : public virtual Grand { public:int i_pa ...
- Cpp 对象模型探索 / 系列文章的索引
一.对象 普通类对象占用的空间. 子类的内存布局. 编译器为对象创建缺省构造函数的条件. 二.虚函数(完) 对象的虚函数表指针的位置. 继承关系下的虚函数手动调用. 虚函数表和虚函数表指针的创建时机. ...
- Cpp 对象模型探索 / 继承关系下的虚函数手动调用
一.多态机理 #include <iostream>class Father { public:virtual void Func1(){std::cout << " ...
- Cpp 对象模型探索 / 不能被继承的类
两种方法 C++ 11 final 关键字 友元类 + 虚继承. 栗子 class A { private:A() {}friend class B; }; class B : virtual pub ...
- Cpp 对象模型探索 / 带有虚继承类的构造函数的调用顺序
栗子 #include <iostream> class A { public:A() { std::cout << "A" << std::e ...
最新文章
- Git如何将本地分支推送到远程库中
- 如何预约升级鸿蒙,超过66万人预约,华为亮出真正王牌旗舰,支持优先升级鸿蒙系统...
- Hibernate双向多对多关联
- 响应式系统reactive system初探
- oozie中时间EL表达式
- css margin
- 如何给表格数据加顺序号php,通过layui给数据表格添加序号
- 福昕高级PDF 专业版程序安装及注意事项
- 求解幂集问题(c语言+蛮力法)
- python导入第三方库失败_史上最详细 Python第三方库添加方法 and 错误解决方法
- 安卓手机管理软件_电话录音管理软件有哪些?
- 代理模式---论坛权限控制代理
- java excel checkbox,使用Apache POI(Java)在XLSX中创建复选框
- android studio海马玩模拟器
- 各种短视频极速版如何实现自动看视频赚钱
- Python正则表达式中的r
- ubuntu 下怎么查看内存条状况
- JVM —— Java 对象占用空间大小计算
- linux 命令断网,linux 断网 扫描基本命令(示例代码)
- 我的世界服务器物品使用权限,MineCraft常用权限大全 - 技巧教程 - 最MC论坛 - 我的世界_Minecraft_联机_服主_资讯_MOD_皮肤_交流_作品_中文论坛...