首页 / C++ / C++ 类的深拷贝和浅拷贝完美解决
C++ 类的深拷贝和浅拷贝完美解决
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C++ 类的深拷贝和浅拷贝完美解决,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1913字,纯文字阅读大概需要3分钟。
内容图文
// 类的深拷贝和浅拷贝 #define _CRT_SECURE_NO_WARNINGS #include<iostream> usingnamespace std; class Point{ public: Point(int _a,int _b,constchar *pin/*in*/){ x = _a; y = _b; remark = (char *)malloc(sizeof(char)*(strlen(pin) + 1)); strcpy(remark, pin); cout << "我是自定义的有参构造函数4" << endl; } Point(Point &pm){ cout << "我是自定义的拷贝构造函数3" << endl; //修改拷贝构造函数 x = pm.x; y = pm.y; //remark = pm.remark; 这句话错误 //修改后的方案 remark = (char *)malloc(sizeof(char)*(strlen(pm.remark) + 1)); strcpy(remark, pm.remark); } ~Point(){ if (remark!=NULL) { free(remark); } cout << "我是自定义的析构函数2" << endl; } void GetPremark(){ printf("指针变量remark的地址是%x\n", remark); } //BBB---运算符重载voidoperator=(Point &pm){ //CCC 解决方案第三步if (remark!=NULL) { free(remark); remark = NULL; } //解决方案改良第二步(以下) x = pm.x; y = pm.y; remark = (char *)malloc(sizeof(char)*(strlen(pm.remark) + 1)); strcpy(remark, pm.remark); } private: int x; int y; char *remark; }; void ProtectA(){ Point p1(1, 1, "123"); Point p2 = p1; printf("这是p1中字符指针的地址\n"); p1.GetPremark();//打印 ad95e8 printf("这是p2中字符指针的地址\n"); p2.GetPremark();//打印 ad95e8 //这说明类对象之间拷贝指针拷贝了指针变量的值(两个指针指向同一片内存),并没有新分配内存 //出现问题:当先调用p2(函数的压栈,先定义后释放)的析构函数的时候,会释放指针变量remark指向的内存, //当调用p1的析构函数的时候就会报错 //解决方案第一步--修改类的拷贝构造函数 //BUG事例 //Point p3;//报错 error C2512: “Point”: 没有合适的默认构造函数可用 //这说明只要定义了有参构造函数,那么c++编译器就不会自动创建无参构造函数 Point p4(2,3,"456"); //赋值操作 //p4 = p2; //分析:赋值操作会将p2的所有值(包括指针变量的值)拷贝到p4对象中 //此时又会出现两个指针变量指向同一片内存的情况,当析构对象p4的时候,会释放指针变量指向的内存 //那么析构p2的时候又会报错(那块内存已经被释放了,被释放了2次) //解决方案第二步--"="运算符重载 //详情见 BBB 运算符重载的使用场景 p4 = p2; //BUG事例 p4 = p1; //分析:当执行p4 = p2; p4 = p1;仔细分析"="重载函数发现,p4 = p2;p4会开辟一块内存N1, //p4 = p1;p4会再开辟一块内存N2,此时N1这块内存永远不会被释放,这就造成了内存泄漏 //为了解决这个问题 //解决方案第三步 //我们可以在执行"="重载函数之前判断一下指针变量指向的内存又没有释放, //(所以要确定--定义对象的时候必须要分配指针变量的内存或者将指针变量置空)///详情见 CCC} void main(){ ProtectA(); system("pause"); }
原文:http://www.cnblogs.com/zhanggaofeng/p/5607832.html
内容总结
以上是互联网集市为您收集整理的C++ 类的深拷贝和浅拷贝完美解决全部内容,希望文章能够帮你解决C++ 类的深拷贝和浅拷贝完美解决所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。