对象的深拷贝和浅拷贝
在copy一个对象时(用一个对象去初始化另外一个对象),会调用类中的拷贝构造函数。如果我们自己没有在类里面写拷贝构造函数,则C++编译器会调用默认的拷贝构造函数。
浅拷贝:如果类定义的对象包含的某个成员是动态内存分配产生的(指针变量成员),你先用该类定义了一个对象1,然后又用这个对象1去初始化另外一个对象2。如果在类里面,没有自己写拷贝构造函数,C++编译器会调用默认的拷贝构造函数,只能将对象1的成员的值赋给对象2的成员,对象1成员指向的内存并没有被复制,也就是说对象1指针成员和对象2指针成员指向的是同一块内存。这样在析构对象时,先析构对象2,对象2指针成员指向的内存被free。由于对象1指针成员和对象2指针成员的值一样,指向的是同一块内存,析构对象1的指针成员时,它所指向的那块内存之前已经被对象2的指针成员free,没法再次free,就会出现宕机(down机),这就是浅拷贝问题。浅拷贝问题在编译阶段不会出问题,只有当程序运行的时候才会发现问题。
浅拷贝问题图解
如果要解决浅拷贝问题,那就必须深拷贝。所谓的深拷贝,就是说不仅将对象1的值拷贝给对象2,而且要将对象1指针成员指向的内存空间也要赋值一份给对象2。这时候,我们就不能再用C++编译器给我们提供的默认拷贝构造函数,必须自己写一份拷贝构造函数。
关于浅拷贝和深拷贝问题,可以参考以下代码:
1 //myname.h 2 #pragma once 3 class myname 4 { 5 public: 6 myname(const char*); 7 myname(const myname&); 8 ~myname(void); 9 void printN(); 10 11 private: 12 int len; 13 char* p; 14 }; 15 16 17 //myname.cpp 18 #include "myname.h" 19 #include "string.h" 20 #include "malloc.h" 21 #include <iostream> 22 23 #define _CRT_SECURE_NO_WARNINGS 24 25 //构造函数 26 myname::myname(const char* myp) 27 { 28 len=strlen(myp); 29 p=(char*)malloc(sizeof(char)*(len+1)); 30 strcpy(p,myp); 31 } 32 33 //拷贝构造函数。如果不自己写该函数,C++编译器会调用默认的拷贝构造函数,则会发生浅拷贝。自己写了该函数,C++编译器就会调用该函数,发生的是深拷贝 34 myname::myname(const myname& n) 35 { 36 len=n.len; 37 p=(char*)malloc(sizeof(char)*(len+1)); 38 strcpy(p,n.p); 39 } 40 41 42 void myname::printN() 43 { 44 std::cout<<"name:"<<p<<std::endl; 45 } 46 47 48 myname::~myname(void) 49 { 50 free(p); 51 p=NULL; 52 len=0; 53 } 54 55 56 //main函数 57 #include<iostream> 58 #include "myname.h" 59 60 using namespace std; 61 62 int main() 63 { 64 65 myname name1("Zhang wuji"); 66 myname name2(name1); 67 name2.printN(); 68 69 70 return 0; 71 }
转载于:https://www.cnblogs.com/jswu-ustc/p/8334954.html
对象的深拷贝和浅拷贝相关推荐
- python深拷贝一个对象_Python对象的深拷贝和浅拷贝详解
本文内容是在<Python核心编程2>上看到的,感觉很有用便写出来,给大家参考参考! 浅拷贝 首先我们使用两种方式来拷贝对象,一种是切片,另外一种是工厂方法.然后使用id函数来看看它们的标 ...
- Python基础:对象的深拷贝和浅拷贝的区别
Python基础:对象的深拷贝和浅拷贝的区别 1 变量与对象 2 不可变对象与可变对象 3 直接赋值 4 浅拷贝 5 深拷贝 参考文献 1 变量与对象 对象:内存中存储数据的实体,有明确的类型.在Py ...
- java 复制Map对象(深拷贝与浅拷贝)
java 复制Map对象(深拷贝与浅拷贝) CreationTime--2018年6月4日10点00分 Author:Marydon 1.深拷贝与浅拷贝 浅拷贝:只复制对象的引用,两个引用仍然指向同一 ...
- 一文搞懂前端对象的深拷贝与浅拷贝
在前端开发过程中常常会听到对象的深拷贝与浅拷贝,对于初学者来说,可能是傻傻的分不清楚,本人将详细介绍javascript中对象的深拷贝与浅拷贝. 一.javascript中的数据类型 基础数据类型 字 ...
- 浅谈对象的深拷贝和浅拷贝
浅谈对象的深拷贝和浅拷贝 一.为什么使用对象的拷贝? 1.在普通数据类型赋值 let a=10let b=aa=20console.log(a)//a=20console.log(a)//b=10 因 ...
- PHP中对象的深拷贝与浅拷贝
2019独角兽企业重金招聘Python工程师标准>>> 最近写了一个php脚本,在脚本中使用到了SplPriorityQueue,会用到两次 因此写了如下: $res=$tmp_re ...
- 【转】C#对象的深拷贝与浅拷贝
转自:http://www.cnblogs.com/phoenix-rock/archive/2006/11/07/shallowcopy_deepcopy.html 1. 深拷贝是指 ...
- vue对象深拷贝_JS 对象的深拷贝和浅拷贝
现象 我们先来看一个demo // 我们先申明一个变量str1, // 然后把变量str1负值(拷贝)给变量str2 // 最后对变量str2进行修改操作 var str1 = 'shen' var ...
- python 实例对象 浅拷贝_Python 对象的深拷贝与浅拷贝 -- (转)
本文内容是在<Python核心编程2>上看到的,感觉很有用便写出来,给大家参考参考! 浅拷贝 首先我们使用两种方式来拷贝对象,一种是切片,另外一种是工厂方法.然后使用id函数来看看它们的标 ...
- Js中对象的深拷贝和浅拷贝
浅拷贝:只拷贝对象的基础属性值,对属性值为对象或数组的属性则拷贝指针. 深拷贝:拷贝对象的所有属性作为一个全新的对象.拷贝前后的对象互不影响. 浅拷贝仅仅是指向被复制的内存地址,如果原地址中对象被改 ...
最新文章
- linux内核bios,BIOS的启动原理——Linux内核设计学习笔记
- 黑马程序员_7k面试题交通管理系统
- [轉]MS SQL 显示表结构
- ASP.NET页面与IIS底层交互和工作原理详解(一)
- 阿里云怎么启动mysql_阿里云启动mysql
- 机器翻译市场需求调研报告
- 数据库:主键外键作用
- python杀掉某个指定的进程
- 如何删除计算机中常用列表,清除右键多余菜单,鼠标右键菜单清理的方法(一) -电脑资料...
- web前端 第一次作业
- BUUCTF 打卡 21/9/1 Many-Time-Pad
- 微信小程序导航栏怎么写
- 国家开放大学2021春2623中医药学概论题目
- Echart统计图-map地图
- 无锡室内设计——流行的几种室内装饰风格
- Base64在线解析,编码转化为图片
- 战争地带2100 mac版
- C/C++ 算法分析与设计:递归(年龄问题)
- 网络游戏外挂分类及实例
- 纽约中央车站将建全球最大苹果专卖店
热门文章
- Ethercat系列(10)用QT实现SOEM主站
- 勤哲EXCEL服务器将明细项合并到单一数据项里
- VMware虚拟化项目中经常使用的三种磁盘置备模式 vmware- vsphere- datastore-disk
- 2020Java初级面试题一数据库
- RSTP/MSTP的产生,作用及如何配置(带有小实验详解)
- Fluent燃料电池系统CFD仿真模型,单通道的单电池模型,包含冷却水道的
- 用VLFeat库进行k-means聚类(C++ 实现)
- vp230引脚功能_SN65HVD230真正中文资料_应用必备
- vs2008命令窗口使用-命令
- Cesium坐标系介绍