2018-04-19  创建人:Ruo_Xiao
开发环境:VS2019
邮箱:xclsoftware@163.com

一、定义

  1. 浅拷贝:仅仅是对两个指针变量中的内容进行了赋值,即:两个指针指向的是同一个内存区域。
  2. 深拷贝:将一个指针按照另一个指针进行申请内存,即:两个指针指向的是不同的内存区域。

二、分析

#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 对象模型探索 / 深浅拷贝相关推荐

  1. Cpp 对象模型探索 / 拷贝构造函数 和 赋值构造函数 的调用时机

    class A { public:A() {};A(const A& obj) {}A& operator=(const A& obj) { return *this; } } ...

  2. Cpp 对象模型探索 / 单一继承的类的内存布局

    目录 1.父类和子类都没有虚函数 2.父类有虚函数.子类没有虚函数 3.父类没有虚函数,子类有虚函数 4.父类和子类都有虚函数 5.总结 #include <iostream> class ...

  3. Cpp 对象模型探索 / 成员初始化列表

    目录 一.何时必须使用? 二.优势 三.细节探究 一.何时必须使用? 成员变量是 const 类型. 成员变量是引用. 基类中含有带形参的构造函数且不存在默认的构造函数. 成员变量是类对象,该对象含有 ...

  4. Cpp 对象模型探索 / 程序转化语义

    一.定义时初始化 源码 #include <iostream> using namespace std;class A { public:A(){std::cout << &q ...

  5. Cpp 对象模型探索 / 含有虚基类的类的内存布局

    一.栗子 class Grand { public:int i_grand_ = 8; };class Parent1 : public virtual Grand { public:int i_pa ...

  6. Cpp 对象模型探索 / 系列文章的索引

    一.对象 普通类对象占用的空间. 子类的内存布局. 编译器为对象创建缺省构造函数的条件. 二.虚函数(完) 对象的虚函数表指针的位置. 继承关系下的虚函数手动调用. 虚函数表和虚函数表指针的创建时机. ...

  7. Cpp 对象模型探索 / 继承关系下的虚函数手动调用

    一.多态机理 #include <iostream>class Father { public:virtual void Func1(){std::cout << " ...

  8. Cpp 对象模型探索 / 不能被继承的类

    两种方法 C++ 11 final 关键字 友元类 + 虚继承. 栗子 class A { private:A() {}friend class B; }; class B : virtual pub ...

  9. Cpp 对象模型探索 / 带有虚继承类的构造函数的调用顺序

    栗子 #include <iostream> class A { public:A() { std::cout << "A" << std::e ...

最新文章

  1. Git如何将本地分支推送到远程库中
  2. 如何预约升级鸿蒙,超过66万人预约,华为亮出真正王牌旗舰,支持优先升级鸿蒙系统...
  3. Hibernate双向多对多关联
  4. 响应式系统reactive system初探
  5. oozie中时间EL表达式
  6. css margin
  7. 如何给表格数据加顺序号php,通过layui给数据表格添加序号
  8. 福昕高级PDF 专业版程序安装及注意事项
  9. 求解幂集问题(c语言+蛮力法)
  10. python导入第三方库失败_史上最详细 Python第三方库添加方法 and 错误解决方法
  11. 安卓手机管理软件_电话录音管理软件有哪些?
  12. 代理模式---论坛权限控制代理
  13. java excel checkbox,使用Apache POI(Java)在XLSX中创建复选框
  14. android studio海马玩模拟器
  15. 各种短视频极速版如何实现自动看视频赚钱
  16. Python正则表达式中的r
  17. ubuntu 下怎么查看内存条状况
  18. JVM —— Java 对象占用空间大小计算
  19. linux 命令断网,linux 断网 扫描基本命令(示例代码)
  20. 我的世界服务器物品使用权限,MineCraft常用权限大全 - 技巧教程 - 最MC论坛 - 我的世界_Minecraft_联机_服主_资讯_MOD_皮肤_交流_作品_中文论坛...

热门文章

  1. 第14条:理解“类对象”的用意
  2. SQL重复记录查询(转载)
  3. 主数据管理(MDM)的七个最佳实践
  4. linux 编译环境包,linux上war包编译环境搭建(示例代码)
  5. docker Harbor
  6. HDFS NameNode进程挂了并且数据也丢失了,如何进行恢复?
  7. vue-cli工程目录结构及相关文件说明
  8. JVM调优:G1垃圾回收器
  9. python保留关键字列表
  10. Linux tail命令