文章目录

  • 浅复制
  • 深复制

有关浅复制与深复制的定义为:对类进行复制的时候按位复制,即把一个对象各数据成员的值原样复制到目标对象中。当类中涉及到指针类型数据成员的时候,往往就会产生指针悬挂问题。

浅复制

看以下结构:

class A{public:int* a;
};A a1;
A b1=a1;

b1=a1执行的是浅复制,此时a1.a和b1.a指向的是同一个内存地址,如果在析构函数里面有对内存的释放。就会出现内存访问异常。因为一块内存空间会被释放两次!

参考以下代码c_person.cpp理解:


#include <iostream>
#include <string.h>
using namespace std;
class person{private:char *name;int age;
public:person(const char *Name,int Age){name=new char[strlen(Name)+1];strcpy(name,Name);age=Age;cout<<"construct ..."<<endl;}~person(){cout<<"destruct ..."<<age<<endl;delete name;}void dispaly(){cout<<name<<" "<<age<<endl;}void setage(int x){age=x;}
};
int main()
{person p1("test",23);person p2=p1;p1.setage(10);p1.dispaly();p2.dispaly();return 0;
}

运行结果如下:

从运行结果我们可以看到程序只是调用了一次构造函数,但是却执行了两次析构函数,不符合预期期望。

对象p2=p1执行的是浅复制,p2中指针name和p1中指针name是指向的同一地址,由于没有定义构造函数,在执行p2=p1的时候,系统采用默认拷贝构造函数(默认的拷贝构造函数不会为新对象重新分配新的内存空间),即按位的拷贝方式将p1中各数据成员的值拷贝到p2的对应成员中,所以导致p1.name=p2.name(指向了同一内存),此时类person的构造函数只会执行一次。

当程序运行结束时,由析构函数执行的规律可知先构造的后执行,所以先执行p2的析构函数,此时系统将p2.name指向的存储单元释放,在执行p1析构函数的时候,p1.name所指向的内存单元又被释放,这样就会造成同一块内存空间被释放两次,造成错误,p1.name也就成了悬挂指针。

深复制

解决这一问题就需要对p1进行深拷贝,即构造拷贝函数,让对象p2在拷贝p1的时候获取新的内存空间。


#include <iostream>
#include <string.h>
using namespace std;
class person{private:char *name;int age;
public:person(const char *Name,int Age){name=new char[strlen(Name)+1];strcpy(name,Name);age=Age;cout<<"construct ..."<<endl;}person(const person& oPerson)        //copy构造函数{name=new char[strlen(oPerson.name)+1];strcpy(name, oPerson.name);age=oPerson.age;cout<<"copy construct ..."<<endl;}~person(){cout<<"destruct ..."<<age<<endl;delete name;}void dispaly(){cout<<name<<" "<<age<<endl;}void setage(int x){age=x;}
};
int main()
{person p1("test",23);person p2=p1;p1.setage(10);p1.dispaly();p2.dispaly();return 0;
}

运行结构:

从运行结果可以看到符合预期期望,从拷贝构造函数定义可以知道,对类对象的复制,重新为新对象分配了新的内存单元。深拷贝和浅拷贝可以简单理解为:如果一个类拥有资源,当这个类的对象发生复制过程的时候,资源重新分配,这个过程就是深拷贝,反之,没有重新分配资源,就是浅拷贝。

C++ 浅复制、深复制详解相关推荐

  1. SV学习笔记—浅复制和深复制的区别详解

    目录 1.句柄的复制 2.对象的复制 2.1浅复制shallow copy 2.2深复制deep copy 3.this的用法 在类中,复制一半会涉及到句柄的复制,浅复制和深复制3种操作,下面来看看这 ...

  2. mysql 流复制_MySQL系列详解六:MySQL主从复制/半同步演示-技术流ken

    前言 随着技术的发展,在实际的生产环境中,由单台MySQL数据库服务器不能满足实际的需求.此时数据库集群就很好的解决了这个问题了.采用MySQL分布式集群,能够搭建一个高并发.负载均衡的集群服务器.在 ...

  3. as3 浅复制 深复制

    基元数据类型:boolean.int.uint.number.string 两种复杂数据类型:array.object 当数组元素全部是基元数据类型时,即全部是值类型时,是没有浅复制和深复制的区别. ...

  4. mysql数据库主主_MySQL主主复制(图文详解)

    MySQL主主复制(图文详解) 发布时间:2020-07-12 23:10:25 来源:51CTO 阅读:218 作者:BonnieJason 一.实现原理 主主复制即在两台MySQL主机内都可以变更 ...

  5. python函数方法里面用浅复制深复制_图解 Python 浅拷贝与深拷贝

    Python 中的赋值语句不会创建对象的拷贝,仅仅只是将名称绑定至一个对象.对于不可变对象,通常没什么差别,但是处理可变对象或可变对象的集合时,你可能需要创建这些对象的 "真实拷贝" ...

  6. python 财务分析-linux 复制移动命令详解

    linux虚拟机主机模式设置ip间割云计算一般薪资多少方在mysql 查询所有表名几十大数据分析应用的解决方案被魔如何查看mysql服务是否开启酒窝软件测试功能测试损因 软件测试阶段如何划分了哼云计算 ...

  7. python中对列表浅复制深复制另类的理解方式

    '''创建者:徐洋创建时间:2017年6月13日22:25:23代码功能:详细分析列表的浅copy和深度copy'''#导入copy模块import copylist1 = [1,2,3,[" ...

  8. C++拷贝构造函数(复制构造函数)详解

    link 复制构造函数是构造函数的一种,也称拷贝构造函数,它只有一个参数,参数类型是本类的引用. 如果类的设计者不写复制构造函数,编译器就会自动生成复制构造函数.大多数情况下,其作用是实现从源对象到目 ...

  9. MySQL复制常用拓扑结构详解

    复制的体系结构有以下一些基本原则: (1)    每个slave只能有一个master: (2)    每个slave只能有一个唯一的服务器ID: (3)    每个master可以有很多slave: ...

  10. pythoncopy函数_Python的shutil模块中文件的复制操作函数详解

    copy()chutil.copy(source, destination) shutil.copy() 函数实现文件复制功能,将 source 文件复制到 destination 文件夹中,两个参数 ...

最新文章

  1. Java删除指定文件夹下的文件和目录
  2. 【 FPGA 】特定情况下消除不稳定态的方法
  3. Tomcat7 配置 ssl
  4. bleve搜索引擎源码分析之索引——mapping真复杂啊
  5. linux的进程命令,Linux基础进程命令详解
  6. 大话设计模式—代理模式
  7. 龙图 VP 李翀:数据化运营及云计算下的运维
  8. 垂直居中及容器内图片垂直居中的CSS解决方法
  9. C#数据结构-稀疏矩阵
  10. linux软件包管理 pdf,中标麒麟Linux系统软件包管理介绍(22页)-原创力文档
  11. win7 网络打印机 未授予用户在此计算机上的请求登录类型,Win7提示未授予用户在此计算机上的请求登录类型...
  12. Mongodb数据库安装
  13. flask-script插件
  14. python下载不了怎么回事_python怎么下载
  15. 中国互联网的N个第一
  16. 一个SDK打破实时语音社交的“不可能三角”
  17. 【统计学】三大相关系数之肯德尔相关系数(kendall correlation coefficient)
  18. Django的模板语言DTL介绍以及渲染方式
  19. linux下交叉编译date命令,arm移植NTP(同步嵌入式linux系统时间)
  20. 移动端:js判断苹果ios各类机型

热门文章

  1. 插入法排序c语言程序,C语言直接插入排序算法
  2. 试验设计——序贯设计
  3. 【160313 18:00】四则运算 2 的单元测试
  4. MQ 消息丢失、重复、积压问题,如何解决?
  5. 合伙开公司要如何规避风险
  6. 计算机基础学习记录2-1
  7. Unity3D——第一人称FPS生存游戏(resident zombies)
  8. 单片机人体感应灯c语言,红外人体感应灯单片机方案
  9. R实战 | 山脊图(ridgeline plot)
  10. php 微信上传素材,微信上传素材php代码