C++ 浅复制、深复制详解
文章目录
- 浅复制
- 深复制
有关浅复制与深复制的定义为:对类进行复制的时候按位复制,即把一个对象各数据成员的值原样复制到目标对象中。当类中涉及到指针类型数据成员的时候,往往就会产生指针悬挂问题。
浅复制
看以下结构:
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++ 浅复制、深复制详解相关推荐
- SV学习笔记—浅复制和深复制的区别详解
目录 1.句柄的复制 2.对象的复制 2.1浅复制shallow copy 2.2深复制deep copy 3.this的用法 在类中,复制一半会涉及到句柄的复制,浅复制和深复制3种操作,下面来看看这 ...
- mysql 流复制_MySQL系列详解六:MySQL主从复制/半同步演示-技术流ken
前言 随着技术的发展,在实际的生产环境中,由单台MySQL数据库服务器不能满足实际的需求.此时数据库集群就很好的解决了这个问题了.采用MySQL分布式集群,能够搭建一个高并发.负载均衡的集群服务器.在 ...
- as3 浅复制 深复制
基元数据类型:boolean.int.uint.number.string 两种复杂数据类型:array.object 当数组元素全部是基元数据类型时,即全部是值类型时,是没有浅复制和深复制的区别. ...
- mysql数据库主主_MySQL主主复制(图文详解)
MySQL主主复制(图文详解) 发布时间:2020-07-12 23:10:25 来源:51CTO 阅读:218 作者:BonnieJason 一.实现原理 主主复制即在两台MySQL主机内都可以变更 ...
- python函数方法里面用浅复制深复制_图解 Python 浅拷贝与深拷贝
Python 中的赋值语句不会创建对象的拷贝,仅仅只是将名称绑定至一个对象.对于不可变对象,通常没什么差别,但是处理可变对象或可变对象的集合时,你可能需要创建这些对象的 "真实拷贝" ...
- python 财务分析-linux 复制移动命令详解
linux虚拟机主机模式设置ip间割云计算一般薪资多少方在mysql 查询所有表名几十大数据分析应用的解决方案被魔如何查看mysql服务是否开启酒窝软件测试功能测试损因 软件测试阶段如何划分了哼云计算 ...
- python中对列表浅复制深复制另类的理解方式
'''创建者:徐洋创建时间:2017年6月13日22:25:23代码功能:详细分析列表的浅copy和深度copy'''#导入copy模块import copylist1 = [1,2,3,[" ...
- C++拷贝构造函数(复制构造函数)详解
link 复制构造函数是构造函数的一种,也称拷贝构造函数,它只有一个参数,参数类型是本类的引用. 如果类的设计者不写复制构造函数,编译器就会自动生成复制构造函数.大多数情况下,其作用是实现从源对象到目 ...
- MySQL复制常用拓扑结构详解
复制的体系结构有以下一些基本原则: (1) 每个slave只能有一个master: (2) 每个slave只能有一个唯一的服务器ID: (3) 每个master可以有很多slave: ...
- pythoncopy函数_Python的shutil模块中文件的复制操作函数详解
copy()chutil.copy(source, destination) shutil.copy() 函数实现文件复制功能,将 source 文件复制到 destination 文件夹中,两个参数 ...
最新文章
- Java删除指定文件夹下的文件和目录
- 【 FPGA 】特定情况下消除不稳定态的方法
- Tomcat7 配置 ssl
- bleve搜索引擎源码分析之索引——mapping真复杂啊
- linux的进程命令,Linux基础进程命令详解
- 大话设计模式—代理模式
- 龙图 VP 李翀:数据化运营及云计算下的运维
- 垂直居中及容器内图片垂直居中的CSS解决方法
- C#数据结构-稀疏矩阵
- linux软件包管理 pdf,中标麒麟Linux系统软件包管理介绍(22页)-原创力文档
- win7 网络打印机 未授予用户在此计算机上的请求登录类型,Win7提示未授予用户在此计算机上的请求登录类型...
- Mongodb数据库安装
- flask-script插件
- python下载不了怎么回事_python怎么下载
- 中国互联网的N个第一
- 一个SDK打破实时语音社交的“不可能三角”
- 【统计学】三大相关系数之肯德尔相关系数(kendall correlation coefficient)
- Django的模板语言DTL介绍以及渲染方式
- linux下交叉编译date命令,arm移植NTP(同步嵌入式linux系统时间)
- 移动端:js判断苹果ios各类机型