浅拷贝与深度拷贝
来源:互联网 发布:宜嘉情感分析 知乎 编辑:程序博客网 时间:2024/05/16 19:03
注意:默认的拷贝是浅拷贝
浅拷贝(只是机械的拷贝)
public:CopyConstructor(){p = new int(100);}/*析构函数*/~CopyConstructor(){assert(p != NULL);delete p;}private:int *p;int width;int height;};int main(){{CopyConstructor CopyConstructor1;CopyConstructor CopyConstructor2(CopyConstructor1);}/*这里加括号的原因是为了上面两条语句的执行范围只是在代码快中,在这个代码块结束时就要释放两个对象,才能调用其析构函数,否则没有 括号时,上面两句的创建的对象存在范围为整个main函数,只有当整个main函数执行结束才能调用析构函数,也就看不到问题所在,同时也就无法释放分配的内存*/system("pause");return 0;}
分析:
由于在执行
CopyConstructor CopyConstructor1;时
默认构造函数中为指针*p分配内存空间,然后在执行CopyConstructor CopyConstructor2(CopyConstructor1);时会调用编译器创建的拷贝构造函数,在该拷贝构造函数中,会产生一个临时变量CopyConstructor2.p来接收CopyConstructor1.p指向的地址空间(这里只是机械的拷贝),所以此时就会有两个指针变量指向堆中的同一片内存,当释放两个对象是,就会执行两次析构函数,既
释放两次同一片内存,所以会出错。解决这个问题就需用到深度拷贝
深度拷贝:(适用于堆分配内存的情况)
#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<assert.h>using namespace std;class CopyConstructor{public:CopyConstructor(const char* str){m_len = strlen(str);m_p = (char*)malloc(m_len + 1);strcpy(m_p,str);}
/*实现深度拷贝其实就是自定以拷贝函数,然后在拷贝函数中重新申请一片内存,此时拷贝就不会出现一片内存有两个指针同时指向的问题*/CopyConstructor(const CopyConstructor &oop1){m_len = oop1.m_len;m_p = (char*)malloc(m_len + 1);strcpy(m_p, oop1.m_p);}~CopyConstructor(void){if (m_p!=NULL)free (m_p);}void print(){cout << m_p << endl;}private:intm_len;char*m_p;};void maindis(void){CopyConstructor opp2("nihao!");CopyConstructor opp3(opp2);opp3.print();}int main(){maindis();system("pause");return 0;}
#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<assert.h>using namespace std;class CopyConstructor{public:CopyConstructor(const char* str){m_len = strlen(str);m_p = (char*)malloc(m_len + 1);strcpy(m_p,str);}
/*实现深度拷贝其实就是自定以拷贝函数,然后在拷贝函数中重新申请一片内存,此时拷贝就不会出现一片内存有两个指针同时指向的问题*/CopyConstructor(const CopyConstructor &oop1){m_len = oop1.m_len;m_p = (char*)malloc(m_len + 1);strcpy(m_p, oop1.m_p);}~CopyConstructor(void){if (m_p!=NULL)free (m_p);}void print(){cout << m_p << endl;}private:intm_len;char*m_p;};void maindis(void){CopyConstructor opp2("nihao!");CopyConstructor opp3(opp2);opp3.print();}int main(){maindis();system("pause");return 0;}
阅读全文
0 0
- 浅拷贝与深度拷贝
- 深度拷贝与浅度拷贝
- 浅拷贝与深度拷贝(原型模式)
- 浅拷贝与深度拷贝(原型模式)
- java浅拷贝与深度拷贝
- 浅拷贝与深度拷贝(原型模式)
- C#深度拷贝,浅拷贝
- iOS 深度理解浅拷贝与深拷贝
- C#中的浅拷贝和深度拷贝
- c++中的浅拷贝和深度拷贝
- 深度拷贝和浅度拷贝
- JS引用类型深度拷贝浅拷贝
- 深度拷贝和浅度拷贝
- js深度拷贝和浅度拷贝
- 深拷贝与浅拷贝
- 深拷贝与浅拷贝
- 深拷贝与浅拷贝
- “浅拷贝”与“深拷贝”
- gitlab 用分支做版本发布
- checkSelfPermission总是返回PERMISSION_GRANTED
- 51Nod-1222-最小公倍数计数
- 算法-归并排序
- Angular 1.63 双向数据绑定 通过 $http 发送数据
- 浅拷贝与深度拷贝
- 九、 通用工具 ----clock和Timer
- 从头开始自己搭建服务器,实现web+android互联(ios暂缓) 开篇
- Ti-am335x-uboot-2015.07移植LCD显示logo功能
- java身份证合法性校验
- Java的深拷贝与浅拷贝
- javascript实现堆栈和简单的应用
- 计算机网络层次划分及协议了解
- 九、 通用工具 ----头文件cstddef,cstdlib和,cstring