浅拷贝:简单的赋值拷贝操作。

深拷贝:在堆区重新申请空间,进行拷贝操作。

C++中在对一个已知对象进行拷贝的时候,会调用类中的拷贝构造函数,如果程序员未定义拷贝构造函数,则会调用编译器默认的拷贝构造函数进行值拷贝!

看一个简单的例子:

#include <iostream>
using namespace std;class Person {
public:Person() {   /*默认构造函数*/cout << "Person默认构造桉树的调用" << endl;}Person(int age,int height) { /*有参构造函数*/m_age = age;m_height = new int(height); //在堆区开辟内存cout << "Person有参构造函数的调用" << endl;}~Person() {if (m_height != NULL) {delete m_height;m_height = NULL;}cout << "Person析构函数的调用" << endl;}int m_age;    //年龄int* m_height;  //体重
};void test01(void) {Person p1(18,160);cout << "p1的年龄是" << p1.m_age << "体重是" << *p1.m_height << endl;Person p2(p1);cout << "p2的年龄是" << p2.m_age << "体重是" << *p2.m_height << endl;}
int main(void)
{test01();system("pause");return 0;
}

可以看出在test01()函数中先调用有参构造函数定义了对象p1,再调用拷贝构造函数将p1的数据复制给p2。代码看似没有错误,运行可以看到结果如下:

       可以发现程序运行出现了一个异常,这是什么原因呢?

这是由于编译系统在我们没有自己定义拷贝构造函数时,会在拷贝对象时调用默认拷贝构造函数,进行的是浅拷贝!即对指针拷贝后会出现两个指针指向同一个内存空间。

由于栈区的规则是先进后出,当执行完拷贝构造函数的时候,就会执行p2的析构函数,导致释放堆区开辟的数据。因此当执行p1的析构函数时就会导致内存释放2次,程序崩溃。

所以,在对含有指针成员的对象进行拷贝时,必须自己定义拷贝构造函数,达到深拷贝的目的,才能必变内存重复释放。

增加拷贝构造函数后的代码:

#include <iostream>
using namespace std;class Person {
public:Person() {   /*默认构造函数*/cout << "Person默认构造桉树的调用" << endl;}Person(int age,int height) { /*有参构造函数*/m_age = age;m_height = new int(height); //在堆区开辟内存cout << "Person有参构造函数的调用" << endl;}//拷贝构造函数  Person(const Person& p) {cout << "Person拷贝构造函数!" << endl;//如果不利用深拷贝在堆区创建新内存,会导致浅拷贝带来的重复释放堆区问题m_age = p.m_age;m_height = new int(*p.m_height);}~Person() {if (m_height != NULL) {delete m_height;m_height = NULL;}cout << "Person析构函数的调用" << endl;}int m_age; //年龄int* m_height;  //体重
};void test01(void) {Person p1(18,160);cout << "p1的年龄是" << p1.m_age << "体重是" << *p1.m_height << endl;Person p2(p1);cout << "p2的年龄是" << p2.m_age << "体重是" << *p2.m_height << endl;}
int main(void)
{test01();system("pause");return 0;
}

即在堆区重新开辟一片内存保存数据,这样就可以避免内存重复释放!!!

C++浅拷贝与深拷贝相关推荐

  1. Java中的浅拷贝与深拷贝

    一.引用拷贝与对象拷贝 class Person implements Cloneable{private String name;private int age;...省略get和set方法 pro ...

  2. js之浅拷贝和深拷贝

    js数据类型主要分基本数据类型和引用数据类型.前者包括Number,String等,后者主要是Object,因此以下会针对不同的数据类型来分析,需要的朋友可以参考一下 1.js内存 js内存,或者说大 ...

  3. 43 JavaScript中的浅拷贝与深拷贝

    技术交流QQ群:1027579432,欢迎你的加入! 欢迎关注我的微信公众号:CurryCoder的程序人生 1.浅拷贝与深拷贝 浅拷贝只是拷贝一层,更深层次对象级别的只拷贝引用. 深拷贝拷贝多层,每 ...

  4. 【进阶4-1期】详细解析赋值、浅拷贝和深拷贝的区别

    一.赋值(Copy) 赋值是将某一数值或对象赋给某个变量的过程,分为下面 2 部分 基本数据类型:赋值,赋值之后两个变量互不影响 引用数据类型:赋址,两个变量具有相同的引用,指向同一个对象,相互之间有 ...

  5. C# 之String以及浅拷贝与深拷贝

    C# 之String以及浅拷贝与深拷贝  一.String到底是值类型还是引用类型 MSDN 中明确指出 String 是引用类型而不是值类型,但 String 表面上用起来却像是值类型,这又是什么原 ...

  6. C# 浅拷贝与深拷贝区别 解惑篇

    问题起源: 昨天被同事问到一个浅拷贝与深拷贝区别的问题,说实在的,记得在学校时在书在看过相关概念区别. 只是,那时的在校生,又有几个能对书本上那写的尽量让鬼都看不懂知识能清晰的理解呢. 工作后虽然也有 ...

  7. clone是深拷贝还是浅拷贝_Cloneable接口的作用与探索理解浅拷贝与深拷贝

    导读:本文将主要讨论设计模式--原型模式中,关于cloneable接口及浅拷贝与深拷贝的概念. 原型模式的理解 关于原型模式的理解,我在网上发现一个有趣且助于理解原型模式的例子在这里分享一下:火影忍者 ...

  8. Java的浅拷贝与深拷贝总结

    Java中的对象拷贝(Object Copy)指的是将一个对象的所有属性(成员变量)拷贝到另一个有着相同类类型的对象中去.举例说明:比如,对象A和对象B都属于类S,具有属性a和b.那么对对象A进行拷贝 ...

  9. 说说JS中的浅拷贝与深拷贝

    outline: 为什么要说JS中深拷贝与浅拷贝 JS对类型的分类 immutable与mutable 简单类型检测 浅拷贝VS深拷贝 为什么要说JS中深拷贝与浅拷贝 近来在研读underscore的 ...

  10. python中的引用、浅拷贝和深拷贝

    在python中,有一句话:"一切皆为对象,一切皆为对象的引用",所以 只要记住这句话就很容易清楚python中的引用.浅拷贝和深拷贝了. 1. 引用 python中的引用是经常使 ...

最新文章

  1. TCPDUMP中文手册
  2. 【编译原理】关于解释器和编译器的讨论
  3. 今日问题:操作必须使用一个可更新的查询。
  4. linux下的ssh和rynsc
  5. pymysql(part3)--pymysql常用函数
  6. GSM BTS Hacking: 利用BladeRF和开源BTS 5搭建基站
  7. 前端基础-CSS的各种选择器的特点以及CSS的三大特性
  8. linux下安装nginx的采坑记录
  9. 最强编程大法,太强了!
  10. 五年前,跳槽涨薪,你笑了,五年后,跳槽降薪,请接受
  11. CI 笔记 easyui 结合后,左侧导航跳转问题
  12. jspstudy oracle,tomcat出错,大神们来看看呐
  13. 服务机器人分类包括哪些?
  14. 【Linux】一步一步学Linux——atq命令(139)
  15. 2019-05-22 Domain注入工具;旁注工具;ASP木马;
  16. LOJ10144宠物收养所
  17. 蓝桥杯练习题--Fibonacci数列
  18. python excel怎么将字母后的数字取出来_Excel提取数字、字母、汉字,靠Python一个公式搞定...
  19. java-web6-Servlet知识
  20. TDA4开发板开发学习

热门文章

  1. 头朝下装进-196℃液氮瓶,第一批冷冻人​现在怎么样了?
  2. 基于功能连接组的自闭症预测模型
  3. 2023年全国最新道路运输从业人员精选真题及答案66
  4. uniapp开发h5下载pdf
  5. spring boot security ajax_springboot集成security
  6. SpringBoot统一清理数据
  7. fMRI独立成分分析方法(ICA)工具GIFT
  8. 计算 100 以内所有 6 的倍数的和
  9. 如何让U盘同时兼容Windows和Mac OS X系统?
  10. PL/SQL 美化器不能美化代码的解决方法