`

浅拷贝的例子

    博客分类:
  • C++
 
阅读更多
浅拷贝和深拷贝的问题多发生在指针变量或者包含指针类型成员的类的对象之间。
先看一个简单例程:
#include <iostream>
using namespace std;
int main()
{
int *p1 = new int(88), *p2; //定义两个整型指针变量
cout < < "p1= " < < p1 < < ", p2= " < < p2 < <endl; //在屏幕上输出p1 和 p2
p2 = p1; //语句1:浅拷贝在此发生了
delete p1;
delete p2; //语句2:报错! 由于两个指针变量之间的浅拷贝导致所指向的内存二次释放
cout < < "p1= " < < p1 < < ", p2= " < < p2 < <endl;
return (0);
}
大家可以看到,语句1进行的操作只是将地址进行了复制,语句执行后,p1和p2指向了同一块内存。之后的delete操作使p1所指向的内存被释放,接下来“灾难”来了,因为p2所指向的内存已经在之前就被释放了,而语句2有要将那块已经释放的内存再次释放,笨笨的计算机倍感诧异,于是程序报错,异常终止。语句1所体现的操作就称为“浅拷贝”,此谓“浅”给人感觉就是表面上的一种拷贝,只是原原本本地将指针变量存储的地址进行了复制。而解决这种问题的办法就是“深拷贝”,即将指针变量所指向的内存也作一个拷贝,大家各一份,谁也别抢谁的,即:
#include <iostream>
using namespace std;
int main()
{
int *p1 = new int(88), *p2; //定义两个整型指针变量
cout < < "p1= " < < p1 < < ", p2= " < < p2 < <endl; //在屏幕上输出p1 和 p2
p2 = new int(88);
*p2 = *p1; //语句3:深拷贝
//p2 = p1; //语句1:浅拷贝
delete p1;
delete p2; //各释放各的内存,互不打扰
cout < < "p1= " < < p1 < < ", p2= " < < p2 < <endl;
return (0);
}
语句3就是将p1所指向的内存作了拷贝给p2,一人一块。
以上是一个简单而直接的例子来说明浅拷贝和深拷贝的问题,而大多数时候这个问题是隐蔽地发生在含有指针类型成员的类的对象之间的。在用一个类的对象实例化另一个对象时(如:
obj2(obj1);),如果使用缺省的拷贝构造函数来实例化,则是一种浅拷贝,如要达到深拷贝的效果,则应该自定义一个拷贝构造函数来手动实现。当然,如果类中没有指针类型的成员,则没有这个必要,但如果有的话,还是很有这个必要的。
分享到:
评论

相关推荐

    深拷贝和浅拷贝一些例子

    深拷贝和浅拷贝一些例子

    Python中列表和数组的赋值以及-浅拷贝和深拷贝的实例讲解

    对Python中列表和数组的赋值 中 ,浅拷贝和深拷贝的实例讲解 浅 引⽤: 列表赋值: 1234567&gt;&gt;&gt; a = [1, 2, 3] &gt;&gt;&gt; b = a &gt;&gt;&gt; print b [1, 2, 3] &gt;&gt;&gt; a[0] = 0 &gt;&gt;&gt; print b [0, 2, 3] 解释:[1, 2, 3]被视作⼀个对象...

    js深拷贝与浅拷贝详解以及例子.pdf

    js深拷贝与浅拷贝详解以及例子

    深拷贝浅拷贝.zip

    该例子代码主要实现C#的浅拷贝和深拷贝,深拷贝是通过复制对象和序列化对象两种方法分别实现的。各位同学各取所需。

    浅谈C++的浅拷贝出现的错误

    如果对象中存在动态成员,如指针,那么仅仅做浅拷贝是不够的,并且容易引发错误,最经典的例子: #include #include &lt;stdio&gt; using namespace std; class A{ public: A(){m_p = new int(10);}; ~A(){cout &lt;...

    iOS深浅拷贝例子

    一个ios的深浅拷贝的demo,请多多下载,多谢,多谢。

    Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)

    1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象。2. copy.deepcopy 深拷贝 拷贝对象及其子对象一个很好的例子: import copya = [1, 2, 3, 4, [‘a’, ‘b’]] #原始对象b = a #赋值,...

    Python中的赋值、浅拷贝、深拷贝介绍

    和很多语言一样,Python中也分为简单赋值、浅拷贝、深拷贝这几种“拷贝”方式。 在学习过程中,一开始对浅拷贝理解很模糊。不过经过一系列的实验后,我发现对这三者的概念有了进一步的了解。 一、赋值 赋值算是这三...

    c# 深拷贝与浅拷贝的区别分析及实例

     浅拷贝是指源对象与拷贝对象共用一份实体,仅仅是引用的变量不同(名称不同)。对其中任何一个对象的改动都会影响另外一个对象。举个例子,一个人一开始叫张三,后来改名叫李四了,可是还是同一个人,不管是张三缺...

    JavaScript数组深拷贝和浅拷贝的两种方法

    例如这个例子: 代码如下:var arr = [“One”,”Two”,”Three”];...像上面的这种直接赋值的方式就是浅拷贝,很多时候,这样并不是我们想要得到的结果,其实我们想要的是arr的值不变,不是吗? 方法一:js的sli

    浅谈Python中copy()方法的使用

    copy()方法返回字典的浅拷贝。 语法 以下是copy()方法的语法: dict.copy() 参数 NA 返回值 此方法返回字典的浅拷贝。 例子 下面的例子显示了copy()方法的使用。 #!/usr/bin/python dict1 = {'Name': 'Zara', '...

    python读取和保存图片5种方法对比

    区别:np.array() 是深拷贝,np.asarray() 是浅拷贝 copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象。 copy.deepcopy 深拷贝 拷贝对象及其子对象 例子: import copy a = [1, 2, 3, 4, ['a', 'b']] #...

    jQuery使用$.extend(true,object1, object2);实现深拷贝对象的方法分析

    本文实例讲述了jQuery使用$....默认情况是false(浅拷贝),并且false是不能够显示的写出来的。如果想写,只能写true(深拷贝) 测试例子: var object1 = {}; var object2 = { b:{ mm:333 }, c:100 }; conso

    python 直接赋值和copy的区别详解

    浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。 深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。 例子: dict1 = {'user':'runoob','num':[1,2,3]} dict2 = dict1 # 浅...

    javascript深拷贝(deepClone)详解

    与深拷贝相对的就是浅拷贝,很多初学者在接触这个感念的时候,是很懵逼的。 为啥要用深拷贝? 在很多情况下,我们都需要给变量赋值,给内存地址赋予一个值,但是在赋值引用值类型的时候,只是共享一个内存区域,...

    百度地图毕业设计源码-python_knowledge:包含基础篇、进阶篇、练习篇、爬虫篇、正则篇、Flask篇、Django篇。持续迭代中

    而浅拷贝则是将一个对象的引用拷贝到另一个对象上,所以如果我们在拷贝中改动,会影响到原对象。我们使用函数function()执行浅拷贝,使用如下所示: &gt;&gt;&gt; b=copy.copy(a) 3、 列表和元组之间的区别是? 答:二者的...

    深入浅出设计模式(中文版)

    3.5.2现实中的拷贝-粘贴 71 3.5.3C#实例——颜色管理器 72 3.5.4Java实例——简单ToolBar 74 3.5.5ShallowCopy与DeepCopy 76 3.5.6优势和缺陷 82 3.5.7应用情景 82 3.6SingletonPattern(单例模式) 82 3.6.1...

    05-大事件和node阶段某马机构前端内部面试题.md

    什么是深拷贝什么是浅拷贝?对闭包的理解?并能举出闭包的例子。什么是原型和原型链。es6-es10新增常用方法?怎么理解函数的防抖和节流?异步函数有哪些?怎么理解面向对象?真数组和伪数组的区别?数组如何进行降维...

    移动端web某马机构前端内部面试题,es,js

    什么是深拷贝什么是浅拷贝?对闭包的理解?并能举出闭包的例子。什么是原型和原型链。es6-es10新增常用方法?怎么理解函数的防抖和节流?异步函数有哪些?怎么理解面向对象?真数组和伪数组的区别?数组如何进行降维...

    深入浅出设计模式(中文版电子版)

    3.5.2现实中的拷贝-粘贴 71 3.5.3C#实例——颜色管理器 72 3.5.4Java实例——简单ToolBar 74 3.5.5ShallowCopy与DeepCopy 76 3.5.6优势和缺陷 82 3.5.7应用情景 82 3.6SingletonPattern(单例模式) 82 3.6.1...

Global site tag (gtag.js) - Google Analytics