//类的深拷贝和浅拷贝
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;class Point{
public:Point(int _a,int _b,const char *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---运算符重载void operator=(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();//打印  ad95e8printf("这是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");
}

C++ 类的深拷贝和浅拷贝完美解决相关推荐

  1. C++ 类的深拷贝与浅拷贝||深拷贝通过重载拷贝构造函数与重载赋值运算符实现

    http://blog.csdn.net/wangshihui512/article/details/9842225 在面向对象程序设计中,对象间的相互拷贝和赋值是经常进行的操作. 如果对象在申明的同 ...

  2. python观察日志(part12)--基于类的深拷贝与浅拷贝

    学习笔记,有错必纠 python代码 一上来,我们先看一段python代码: # -*- coding: utf-8 -*-import copyclass Bunny():passclass Dog ...

  3. 更清晰的认识对象——深拷贝与浅拷贝

    对象在引用的时候引用的是对象的地址,所以导致如果修改其中一个对象,就会对其他引用这个地址的对象进行修改,这种结果并不是我们想要的,这个时候我们就要用到深拷贝和浅拷贝去解决这个问题了. var a = ...

  4. C++本质:类的赋值运算符=的重载,以及深拷贝和浅拷贝

    关键词:构造函数,浅拷贝,深拷贝,堆栈(stack),堆heap,赋值运算符 摘要:     在面向对象程序设计中,对象间的相互拷贝和赋值是经常进行的操作.     如果对象在申明的同时马上进行的初始 ...

  5. 【黑马程序员 C++教程从0到1入门编程】【笔记4】C++核心编程(类和对象——封装、权限、对象的初始化和清理、构造函数、析构函数、深拷贝、浅拷贝、初始化列表、友元friend、运算符重载)

    黑马程序员C++教程 文章目录 4 类和对象(类属性[成员属性],类函数[成员函数]) 4.1 封装 4.1.1 封装的意义(三种权限:public公共.protected保护.private私有)( ...

  6. C++类的赋值运算符“=”重载,以及深拷贝和浅拷贝

    C++类的赋值运算符"="重载,以及深拷贝和浅拷贝 在面向对象程序设计中,对象间的相互拷贝和赋值是经常进行的操作. 如果对象在申明的同时马上进行初始化操作,则称之为拷贝运算.例如: ...

  7. Python 精选笔试面试习题—类继承、方法对象、包管理、闭包、可变类型作为默认参数、列表引用、sort与sorted、 append 和 extend、深拷贝和浅拷贝

    1. 类继承 如下代码 class A(object):def show(self):print 'This is calss A'class B(A):def show(self):print 'T ...

  8. 深拷贝与浅拷贝、空类与空数组

    一.深拷贝与浅拷贝 说得简单点,假设一个类有指针成员,如果在拷贝的时候顺带连指针指向的内存也分配了,就称为深拷贝,如下图(v2 从 v 拷贝而来): 如果只是分配指针本身的内存,那就是浅拷贝,如下图: ...

  9. [完美解决]无线网卡windows仍在设置此设备的类配置,代码56

    [完美解决]无线网卡windows仍在设置此设备的类配置,代码56       先说一下痛点,最近电脑突然连不上WIFI了,打开设备管理器卸载驱动也好,重启也好,不管用,理所当然的就以为是家里来的修电 ...

最新文章

  1. 第十六届全国大学生智能汽车竞赛--百度智慧交通(东部赛区)
  2. C#服务器端获取客户端(html)控件值
  3. 组合数 com(n,r)
  4. Spring Boot微服务,Docker和Kubernetes研讨会–第2部分
  5. LeetCode 513. 找树左下角的值(按层遍历 queue)
  6. c++ string后面会添加‘\0‘
  7. git 编辑提交的技巧
  8. c++ 无法读取内存_为什么内存频率只有2133比实际低?开XMP提高内存频率方法
  9. WPF设计の画刷(Brush)
  10. C中define的#和##
  11. 【UVA1592】Database (字符串读入技巧和map的使用)
  12. C语言——数据结构(线性,树形,图形结构等)
  13. 概率图模型之贝叶斯网络的理解与应用
  14. R语言︱线性混合模型理论与案例探究(固定效应随机效应)
  15. Mongo和Couch对比
  16. 高3老师给大一学生的一封信
  17. VScode无法只按住鼠标左键选取多行
  18. DELL 电脑 重装系统出现 no boottable devices found
  19. uni-app 微信小程序 分享功能 传参 接收 与 调试
  20. 【知识科普】解读闪电/雷电网络,零基础秒懂!

热门文章

  1. 9102 BITRUN Hackathon is COMING!
  2. Struts2+Spring+Hibernate step by step 11 ssh拦截验证用户登录到集成
  3. jquery工具方法parseJSON
  4. [实战] 用数人云,部署弹性 ELK 集群就五步 1
  5. .NET_.NET Copy Web 部署概念_01-3
  6. 一起谈.NET技术,编写T4模板无法避免的两个话题:quot;Assembly Lockingquot;amp;quot;Debugquot;...
  7. 三道题套路解决递归问题
  8. 使用DB2的with as 语句 实现树的递归查询
  9. 关于c语言编写 单项链表 的创建、插入、修改、删除、显示、退出 的程序案例
  10. ajax提交输入内容,当输入用于提交时,AJAX表单提交