<C++略识>之浅拷贝与深拷贝
来源:互联网 发布:淘宝折也怎么报名 编辑:程序博客网 时间:2024/06/11 04:48
浅拷贝:又称之为位拷贝,是指当进行对象拷贝时,只是将数据成员的值进行了简单拷贝。
深拷贝:又称之为值拷贝,是指当进行对象拷贝时,不是简单的做值的拷贝,而是将堆中内存的数据也进行了拷贝。
浅拷贝和深拷贝两者的区别如下:
深拷贝在创建新的对象时,该对象自己在堆区申请一个内存空间,这样就不会出现在调用析构的时候找不到内存空间;因为如果是浅拷贝的话,所有的指针都指向同一个内存空间,当有一个对象生命周期结束后,那么该对象的内存空间要被回收,这样其他对象在析构的时候就找不到对应的内存空间,会崩溃!!
用一句简单的话来说就是: 浅拷贝,只是对指针的拷贝,拷贝后两个指针指向同一个内存空间,深拷贝不但对指针进行拷贝,而且对指针指向的内容进行拷贝,经深拷贝后的指针是指向两个不同地址的指针。
深拷贝和浅拷贝也可以简单理解为: 如果一个类拥有资源,当这个类的对象发生复制过程的时候,资源重新分配,这个过程就是深拷贝,反之,没有重新分配资源,就是浅拷贝。
[注意]: C++编译器默认的拷贝构造函数是浅拷贝。
深浅拷贝的实现方法举例:
//浅拷贝实现class Array{public: Array() { m_iCount = 5; m_pArr = new int[m_iCount]; } Array(const Array &arr) //拷贝构造函数 { m_iCount = arr.m_iCount; m_pArr = arr.m_pArr; }private: int m_iCount; int *m_pArr;};//深拷贝实现class Array{public: Array() { m_iCount = 5; m_pArr = new int[m_iCount]; } Array(const Array &arr) //拷贝构造函数 { m_iCount = arr.m_iCount; m_pArr = new int[m_iCount]; for(int i = 0; i < m_iCount; i++) { m_pArr[i] = arr.m_pArr[i]; } }private: int m_iCount; int *m_pArr;};int main(){ Array arr1; Array arr2 = arr1;//调用拷贝构造函数 return 0;}
这里当调用浅拷贝时,arr2和arr1中的指针m_pArr就会指向内存中的同一块内存空间,这样当我们去销毁arr1这个对象的时候,我们为了避免内存泄漏,肯定会释放掉m_pArr所指向的这段内存。如果我们已经释放掉了这段内存,我们再去销毁arr2这个对象时,我们肯定也会以同样的方式去释放掉arr2中m_pArr这个指针所指向的这段内存,那么就相当于,同一块内存被释放了两次,造成程序崩溃。
而当我们调用深拷贝时,拷贝的时候不是将指针的地址简单的拷贝过来,而是将指针所指向的内存当中的每一个元素依次的拷贝过来,即:在拷贝函数中先申请了一段内存,然后将arr中的m_pArr所指向的每一个元素都拷贝到当前的m_pArr所指向的相应的内存当中去。由于arr1中的m_pArr和arr2中的m_pArr指向的是两个不同的内存空间,所以无论我们对arr1和arr2中的哪一个进行销毁与否,都不会影响另外一个。
- <C++略识>之浅拷贝与深拷贝
- Objective-C之深拷贝与浅拷贝
- Objective-C之深拷贝与浅拷贝
- c++-深拷贝与浅拷贝
- 【c++】浅拷贝与深拷贝
- Objective-C 深拷贝与浅拷贝
- [C++]深拷贝与浅拷贝
- python3之深拷贝与浅拷贝
- Python对象拷贝之浅拷贝与深拷贝
- C语言拾遗:位拷贝与值拷贝,浅拷贝与深拷贝
- C语言拾遗:位拷贝与值拷贝,浅拷贝与深拷贝
- 深拷贝与浅拷贝
- 深拷贝与浅拷贝
- 深拷贝与浅拷贝
- “浅拷贝”与“深拷贝”
- 深拷贝与浅拷贝
- 深拷贝与浅拷贝
- 深拷贝与浅拷贝
- AsyncTask(异步)和Thread(线程)的使用与对比
- 把数组排成最小的数
- 使用Toolbar + DrawerLayou实现菜单侧滑,改变toolbar左上角图标
- ServletContext容器,网站访问量
- Java swing
- <C++略识>之浅拷贝与深拷贝
- Maven为web项目同时打jar和war包,deploy时只上传jar包的配置
- 解决Eclipse环境变量中的Web App Libraries下没有jar包的问题
- fileoutputstream和fileWrite和bufferedBufferedOutputStream区别
- 如何访问他人电脑上的共享文件夹
- 双边滤波原理
- Android强制设置横屏或竖屏 切换的问题
- 如何在Android中取得当前进程名
- 上海短租