对于深拷贝和浅拷贝的理解
来源:互联网 发布:淘宝客服打电话技巧 编辑:程序博客网 时间:2024/06/05 11:58
深拷贝(值拷贝)和浅拷贝(位拷贝)的区别
浅拷贝:就是对指针的拷贝,拷贝完成后,两个指针指向同一块内存地址空间;
深拷贝:不但是对指针的拷贝,而且对指针指向的内容进行拷贝,
拷贝完成之后的两个指针指向两块不同的内存空间。
浅拷贝容易出现的问题:
(1)浅拷贝只是对类中的简单数据成员进行赋值,当类的成员变量存在指针成员时,就会出现问题。
(2)在浅拷贝中由于obj1.m_data,obj2.m_data指向同一个内存空间,在delete obj1.m_data之后,该内存已经被释放(内存空间不可用),而obj2.m_data也指向它,它的内存空间已经释放,它就成为野指针,再去delete obj2.m_data的时候,就会出现内存泄漏,导致程序异常崩溃。
举例:
浅拷贝只是对类中的简单数据成员进行赋值,当类的成员变量存在指针成员时,就会出现问题。
#include <iostream>#include <string.h>using namespace std;class A{private: char *m_data; //定义私有变量指针public: A() { this->m_data = new char(12); cout << "构造函数"; } /*A(A &s)//自定义拷贝函数 { int length = strlen(s.m_data); m_data = new char(12); strcpy(m_data, s.m_data); cout << "拷贝构造"; }*/ ~A() //自定义析构函数 { if (this->m_data != NULL) { delete m_data; m_data = NULL; cout << "析构函数"; } }};int main(){ A obj1; A obj2(obj1); return 0;}
分析:在自己未定义拷贝构造函数时,会调用体统默认的拷贝构造函数,实现浅拷贝,由于类里面存在指针成员,在de
深拷贝:类的成员变量存在指针的情况,所以不仅是拷贝的值的情况,而且也是给指针重新分配内存空间。
举例:
#include <iostream>#include <string.h>using namespace std;class A{private: char *m_data; //定义私有变量指针public: A() { this->m_data = new char(12); cout << "构造函数"; } A(A &s)//自定义拷贝函数 { int length = strlen(s.m_data); m_data = new char(12); strcpy(m_data, s.m_data); cout << "拷贝构造"; } ~A() //自定义析构函数 { if (this->m_data != NULL) { delete m_data; m_data = NULL; cout << "析构函数"; } }};int main(){ A obj1; A obj2(obj1); return 0;}
分析: 将自己定义的拷贝构造函数放开,就会完成深拷贝,其指针的地址对应不同的内存空间,所以执行析构函数时不会出错。
总结:当类中存在指针成员变量时,尽量自己定义拷贝构造函数,不去使用系统的默认拷贝构造函数,避免出现程序崩溃的问题。
阅读全文
0 0
- 对于深拷贝和浅拷贝的理解
- 深拷贝和浅拷贝的理解?
- 深拷贝和浅拷贝的理解
- 深拷贝和浅拷贝的理解?
- 深拷贝和浅拷贝的理解?
- copy深拷贝和浅拷贝的理解和使用
- 浅拷贝和深拷贝理解
- 对深拷贝和浅拷贝的个人理解
- 对深拷贝和浅拷贝的再次理解
- C++中的深拷贝和浅拷贝的简单理解
- 理解JS的浅拷贝和深拷贝
- 深拷贝和浅拷贝的理解与应用
- 浅拷贝&深拷贝的再次理解
- 关于C++ 拷贝构造函数,深拷贝和浅拷贝的理解
- JAVA中深拷贝与浅拷贝(在网上找到的) 希望对于理解深拷贝与浅拷贝有帮助
- JAVA中深拷贝与浅拷贝(在网上找到的) 希望对于理解深拷贝与浅拷贝有帮助
- 对于拷贝构造函数和赋值构造函数的理解
- 对于拷贝构造函数和赋值构造函数的理解
- 极限验证,滑动验证-java实现
- HBuilder中的eclipse git插件在pull时报错:cannot open git-upload-pack
- 深蓝的大难题:稳定婚姻问题
- Voronoi图
- 4位网关高手论道:什么才是好的微服务网关?
- 对于深拷贝和浅拷贝的理解
- 详解java定时任务
- JDBC的介绍和数据库的连接
- THINKPHP字数限制,简介等使用,显示规定字数,剩余用...显示
- iOS开发:xcode无法选择设备和corner stone如何过滤上传文件
- 理解OAuth 2.0
- 将springBoot项目部署到docker入门实例
- 奖励
- 算法模板之次短路