C/C++学习之路(二)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/article/details/52806329

                                                   C/C++学习之路(二)   

今天我想分享的是关于深拷贝与浅拷贝的区别。     

         先说下自己的理解吧,浅拷贝,即在定义一个类A,使用类似A obj;  A obj1(obj);或者A obj1 = obj; 时候,由于没有自定义拷贝构造函数,C++编译器自动会产生一个默认的拷贝构造函数。这个默认的拷贝构造函数采用的是“位拷贝”(浅拷贝),而非“值拷贝”(深拷贝)的方式,如果类中含有指针变量,默认的拷贝构造函数必定出错。          用一句简单的话来说就是浅拷贝,只是对指针的拷贝,拷贝后两个指针指向同一个内存空间,深拷贝不但对指针进行拷贝,而且对指针指向的内容进行拷贝,经深拷贝后的指针是指向两个不同地址的指针。           那么浅拷贝会出现什么问题呢?           假如有一个成员变量的指针,char *m_data;          其一,浅拷贝只是拷贝了指针,使得两个指针指向同一个地址,这样在对象块结束,调用函数析构的时,会造成同一份资源析构2次,即delete同一块内存2次,造成程序崩溃。          其二,浅拷贝使得obj.m_data和obj1.m_data指向同一块内存,任何一方的变动都会影响到另一方。          其三,在释放内存的时候,会造成obj1.m_data原有的内存没有被释放(这句话,刚开始我不太理解,如果没有走自定义的拷贝构造函数,申请内存空间,A obj1(obj);也不走默认构造函数,走的是默认的拷贝构造函数,何来分配空间直说,更不会造成obj1.m_data原有的内存没有被释放,这里刚开始我一直有疑问),造成内存泄露。          事实是这样的,当delete obj.m_data, obj.m_data内存被释放后,由于之前obj.m_data和obj1.m_data指向的是同一个内存空间,obj1.m_data所指的空间不能在被利用了,delete obj1.m_data也不会成功,一致已经无法操作该空间,所以导致内存泄露。           深拷贝采用了在堆内存中申请新的空间来存储数据,这样每个可以避免指针悬挂

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Python爬虫与数据挖掘

Python正则表达式初识(十)附正则表达式总结

其中“+”的意思是表示连续,在这里代表的意思是连续的数字。但是输出只有“4”这个字符,原因是贪婪模式所致,在上一篇文章中也有提及。

1165
来自专栏程序生活

Python中defaultdict用法

1976
来自专栏逻辑熊猫带你玩Python

Python | 6大数据类型方法归纳总结(中)

可以直接使用tuple()创建一个新的元组,或者,使用tuple()将一个对象转换成元组。

1464
来自专栏性能与架构

mysql char与varchar类型的区别

image.png 基本区别 char 是固定长度的,varchar 是可变长度的 char 如果某个长度小于M,MySQL就会在它的右边用空格补足,使长度达到...

3345
来自专栏前端知识分享

第164天:js方法调用的四种模式

函数名提升: script中脚本,在执行之前,会先把脚本中的所有的函数先进行编译解析,然后执行普通的js代码。

882
来自专栏python读书笔记

python 数据分析基础 day2-数值及字符串数值字符串

今天说一下python 的内置的数据类型以及相应的操作方法 数值 数值类型主要有整数(int)、浮点数(flooat)、长整数(long)、复数(complex...

30810
来自专栏Java帮帮-微信公众号-技术文章全总结

04.Java对象和类

04.Java对象和类 Java 对象和类 Java作为一种面向对象语言。支持以下基本概念: 多态 继承 封装 抽象 类 对象 实例 方法 重载 本节我们重点研...

4386
来自专栏码云1024

Java 程序运行过程中的内存分析

3146
来自专栏blackheart的专栏

[C#1] 5-属性

1.无参属性 当定义一个属性时,编译器会在生成的托管模块中产生一下3项: 1:get访问器方法,定义get时才有; 2:set访问器方法,定义set时才有; 3...

1976
来自专栏web

js中push(),pop(),unshift(),shift()的用法小结

1102

扫码关注云+社区