浅拷贝就是对象的数据成员之间的简单赋值,如你设计了一个没有类而没有提供它的复制构造函数,当用该类的一个对象去给令一个对象赋值时所执行的过程就是浅拷贝,如:

class A{ public: A(int _data) :
data(_data){} A(){}
private: int data;
};
int main()
{ A a(5), b = a; // 仅仅是数据成员之间的赋值 }

这一句b = a;就是浅拷贝,执行完这句后b.data = 5;
如果对象中没有其他的资源(如:堆,文件,系统资源等),则深拷贝和浅拷贝没有什么区别,

但当对象中有这些资源时,例子:

class A
{ public: A(int _size) : size(_size)
{data = new int[size];
} // 假如其中有一段动态分配的内存
 A(){};~A()
{delete [] data;
} // 析构时释放资源
private: int* data;
int size;
}
int main()
{ A a(5),b = a; // 注意这一句 }

这里的b = a会造成未定义行为,因为类A中的复制构造函数是编译器生成的,所以b = a执行的是一个浅拷贝过程。我说过浅拷贝是对象数据之间的简单赋值,比如:
b.size = a.size; b.data = a.data; // Oops!
这里b的指针data和a的指针指向了堆上的同一块内存,a和b析构时,b先把其data指向的动态分配的内存释放了一次,而后a析构时又将这块已经被释放过的内存再释放一次。
对同一块动态内存执行2次以上释放的结果是未定义的,所以这将导致内存泄露或程序崩溃。

所以这里就需要深拷贝来解决这个问题,

深拷贝指的就是当拷贝对象中有对其他资源(如堆、文件、系统等)的引用时(引用可以是指针或引用)时,

对象的另开辟一块新的资源,而不再对拷贝对象中有对其他资源的引用的指针或引用进行单纯的赋值。

如:

class A
{
public: A(int _size) : size(_size)
{data = new int[size];}
// 假如其中有一段动态分配的内存
 A(){};A(const A& _A) : size(_A.size)
{data = new int[size];}
// 深拷贝
~A(){delete [] data;}// 析构时释放资源
private: int* data; int size;}
int main(){ A a(5), b = a; // 这次就没问题了 }

总结:

深拷贝和浅拷贝的区别是在对象状态中包含其它对象的引用的时候,当拷贝一个对象时,如果需要拷贝这个对象引用的对象,则是深拷贝,否则是浅拷贝。

 在某些状况下,类内成员变量需要动态开辟堆内存,如果实行位拷贝,也就是把对象里的值完全复制给另一个对象,如A=B。这时,如果B中有一个成员变量指针已经申请了内存,那A中的那个成员变量也指向同一块内存。这就出现了问题:当B把内存释放了(如:析构),这时A内的指针就是野指针了,出现运行错误。

  深拷贝和浅拷贝可以简单理解为:如果一个类拥有资源,当这个类的对象发生复制过程的时候,资源重新分配,这个过程就是深拷贝,反之,没有重新分配资源,就是浅拷贝。

深拷贝与浅拷贝~动态内存释放有关相关推荐

  1. Python基础教程:赋值、深拷贝与浅拷贝(内存地址)

    1.python中的可变对象与不可变对象 (1) 可变对象:dict,list def dict_test():a = {}b = aprint(id(a)) # 140367329543360 a[ ...

  2. 从结构体、内存池初始化到申请释放,详细解读鸿蒙轻内核的动态内存管理

    摘要:本文带领大家一起剖析了鸿蒙轻内核的动态内存模块的源代码,包含动态内存的结构体.动态内存池初始化.动态内存申请.释放等. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列九 动态内存Dyna ...

  3. 动态内存的分配与释放

    1.new与delete运算 c++提供了两个中重要的运算符:new和delete.由于他们是运算符不是函数,因此执行效率更高. 运算符 功能 目 结合性 用法 new[] 动态分配 单目 自右向左 ...

  4. keil c51的内部RAM(idata)动态内存管理程序(转)

    源:keil c51的内部RAM(idata)动态内存管理程序 程序比较简单,但感觉比较有意思,个人认为有一定应用价值,希望大家有更好的思路和方法,互相促进. 程序的基本思路是:在CPU堆栈指针SP以 ...

  5. 从五大结构体,带你掌握鸿蒙轻内核动态内存Dynamic Memory

    摘要:本文带领大家一起剖析了鸿蒙轻内核的动态内存模块的源代码,包含动态内存的结构体.动态内存池初始化.动态内存申请.释放等. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列九 动态内存Dyna ...

  6. LiteOS内核源码分析:动态内存之Bestfit分配算法

    本文分享自华为云社区<LiteOS内核源码分析系列十三 动态内存Bestfit分配算法>,原文作者:zhushy . 内存管理模块管理系统的内存资源,它是操作系统的核心模块之一,主要包括内 ...

  7. 动态内存分配(详解)

    动态内存分配 1.堆内存分配 : C/C++定义了4个内存区间:代码区,全局变量与静态变量区,局部变量区即栈区,动态存储区,即堆(heap)区或自由存储区(free store). 堆的概念: 通常定 ...

  8. C语言提高篇之——动态内存管理

    目录 1. 动态内存分配存在的意义 2.动态内存函数介绍 2.1 malloc 2.2 free 2.3 calloc 2.4 realloc 3.常见的动态内存错误 3.1 对空指针解引用 3.2 ...

  9. 【C语言进阶】详解C语言动态内存管理

    前言: 今天这篇博客将为大家讲解如何通过开辟动态内存,从而写出更加优秀的的程序.同时今天的内容对于以后想要继续学习c++的同学来说也尤为重要.那就让我们进入正题吧. 一.动态内存概述: 什么是动态内存 ...

最新文章

  1. html中radio、checkbox选中状态研究(静下心来看,静下心来总结)
  2. 常用器件选型——电源篇
  3. 呼叫我或异步REST
  4. msp430中如何连续对位进行取反_四元数数控:如何保养视觉对位平台?
  5. 精通Android自定义View(八)绘制篇Canvas分析之绘制文本
  6. java 定时任务spring_Spring实现定时任务调度
  7. XDOC云服务API(二)
  8. java比较两个字符串变量_Java 比较两个字符串内容是否相等
  9. layui 点击头像 上传头像
  10. 主机无法复制文件到ubuntu虚拟机的解决方法
  11. 重启打印机(打印机任务无法取消时)
  12. [分享]来自CSDN的精华网址
  13. 美团买菜助手来了,自动点击,助你买菜
  14. javaWeb之Response
  15. 鸿蒙智慧屏和pro有什么区别,华为智慧屏V55i和荣耀智慧屏PRO区别对比
  16. FAQ04【ElastiSearch】报错:org.elasticsearch.discovery.MasterNotDiscoveredException异常解决
  17. 面向嵌入式开发的C++中间件库
  18. 生产环境openssl漏洞-升级openssl到最新版本
  19. 自定义右键菜单 html,自定义右键菜单代码详解(转)
  20. 《2021年全国沙雕新闻TOP30》(全程卧槽!)

热门文章

  1. mysqldump: Got error: 2003: Can't connect to MySQL server on '127.0.0.1' (10060)
  2. SerfJ REST
  3. 添加mysql引擎错误
  4. 年度盛宴——2012年最精彩的15个 CSS3 教程
  5. Struts+Spring+Hibernate练习(完整)(1)
  6. .NET特性:异步流
  7. 最小乘积生成树和最小乘积最大匹配
  8. itop修改附件上传大小限制
  9. GridView总结二:GridView自带编辑删除更新
  10. MYSQL出错代码列表