深拷贝和浅拷贝的优缺点


看了深拷贝,浅拷贝优缺点,我们知道浅拷贝效率高,但涉及到指针引用等会涉及到指针的多次释放导致悬挂指针。深拷贝,不会造成指针悬挂的问题,但会浪费空间以及效率较低的问题。
下面看下用到浅拷贝的情况:

#include <iostream>using namespace std;class A
{
public:A(int _data) : data(_data) {}A() {}int getdata(){return data;}
private:int data;
};
int main()
{A a(5), b = a; // 仅仅是数据成员之间的赋值 cout << "b的data值" << b.getdata();return 0;
}
/*
这一句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;
}

注意这一句a a(5), b = a; 当我们这么用的时候,直接想带你给与a,b对象的dada成员指向同一块堆内存。我们在栈区新建的对象被析构时,会导致data上的内存被析构两次,从而出现问题。那么怎么解决呢?可以使用深拷贝。
如下:

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

可以看到我们用了A(const A& _A) : size(_A.size)
{
data = new int(size);
} //这个 深拷贝
我们将为指针成员data去new一块新的地址。这杨当我们析构这块内存的时候,就会分别析构自己的内存地址。

关于写时复制,是利用引用计数的原理结合了兼具深拷贝和浅拷贝的优点。
请看如下链接:
写时复制

C++深拷贝与浅拷贝以及写时复制相关推荐

  1. Apache Hudi的写时复制和读时合并

    Apache Hudi http://hudi.apache.org/ http://hudi.apache.org/docs/quick-start-guide.html Hudi是什么 Hudi将 ...

  2. siwft 写时复制 Copy-On-Write

    写时复制 Copy-On-Write 1 定义 在siwft 标准库中,Array,Dictionary,Set这样的集合类型是通过写时复制来实现的. import Foundationvar a1 ...

  3. 写时复制,写时拷贝,写时分裂,Copy on write

    2019独角兽企业重金招聘Python工程师标准>>> 写时复制,写时拷贝,写时分裂 (Copy-on-write,简称COW)是计算机资源管理方面的一种优化技术,有着广泛的应用,比 ...

  4. 写时复制(Copy-On-Write)思想在Java中的应用

    以下文章来源方志朋的博客,回复"666"获面试宝典 来源:https://blog.csdn.net/fuzhongmin05/article/details/117076906 ...

  5. PHP写时复制, 变量复制和对象复制不同!!!

    2016年3月18日 15:09:28 星期五 一直以为PHP对象也是写时复制....... 其实: PHP的变量是写时复制, 对象是引用的 写时复制: $a = $b; 如果$b的内容不改变, $a ...

  6. PHP 数组变量之写时复制的要点 只有数组才有的概念。

    1.如果数组指针位置非法,复制时,会将新数组指针初始化! 2.值传递时,PHP采用了一个COW(写时复制,copy on write)的优化措施! 写时复制的两个要点:  (实际开发可以使用reset ...

  7. fork()和写时复制

    写时复制技术最初产生于Unix系统,用于实现一种傻瓜式的进程创建:当发出fork(  )系统调用时,内核原样复制父进程的整个地址空间并把复制的那一份分配给子进程.这种行为是非常耗时的,因为它需要: · ...

  8. 实战并发编程 - 05等效不可变对象CopyOnWriteArrayList适用场景剖析_写时复制COW

    文章目录 Pre 等效不可变对象 实例变量array就是一个等效不可变对象? 写时复制机制 写时复制的目的 优点 缺点 CopyOnWriteArrayList的使用场景 小结 Pre 本篇文章我们分 ...

  9. Linux-Copy On Write写时复制机制初探

    文章目录 生猛干货 COW概述 *Unix fork 函数族exec( ) 为什么有了COW? COW 原理 COW的优缺点 小结 搞定Linux核心技术 生猛干货 从系统安装到程序员必备的Linux ...

最新文章

  1. centos7配置bind重启后错误解决
  2. sql server 2008数据导入Oracle方法
  3. 在python中如何比较两个float类型的数据是否相等
  4. php utf8 html字符,PHP:utf-8编码,htmlentities给出了奇怪的结果
  5. 【机器学习】详解 BackPropagation 反向传播算法!
  6. JavaScript——max-age
  7. 基于IdentityServer4的OIDC实现单点登录(SSO)原理简析
  8. JavaScript中的循环
  9. python中的变量的作用_Python中的变量作用域
  10. Hibernate中Java对象的生命周期
  11. Q8 凯立德 J07 升级方法
  12. java web 编程技术 答案_《javaweb编程技术》课后习题答案.docx
  13. 微软放弃WPF了?自定义控件库有前途
  14. 几个文件vtp格式转stl格式
  15. 无损音乐ape转wav图文教程
  16. windows、ubuntu双系统安装教程
  17. [转]一个中高级PHP工程师所应该具备的能力
  18. python构造函数在创建对象时,没有自动执行,object has no attribute
  19. revit学习-视图
  20. MATLAB入门与作图

热门文章

  1. 对称加密和非对称加密转载
  2. php 禁止浏览器直接访问网页_PHP禁止直接从浏览器输入地址访问PHP文件
  3. 加速收敛_引入Powerball 与动量技术,新SGD优化算法收敛速度与泛化效果双提升 | IJCAI...
  4. 微课|中学生可以这样学Python(例9.1):Excel导入SQLite(2)
  5. 微课|中学生可以这样学Python(8.4节):递归算法例题讲解1
  6. Python绘制匀加速运动质点的速度-时间图像与位移-时间图像
  7. Python函数嵌套定义的洪荒之力
  8. java 线程池 包_Java并发包下线程池类小结
  9. openstack常用运维命令_OpenStack运维指南pdf
  10. 一行一个链接代码_AI最优论文+代码查找神器:966个ML任务、8500+论文任你选