深拷贝和浅拷贝
2015-08-11 10:24
281 查看
这个本应该是昨天的内容,但昨天下于都贷款还有交学费的事耽误了,所以搁置到今天处理。
下面来分析下深拷贝和浅拷贝的重要差别。
简单的来说就是,在有指针的情况下,浅拷贝只是增加了一个指针指向已经存在的内存,而深拷贝就是增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存,采用深拷贝的情况下,释放内存的时候就不会出现在浅拷贝时重复释放同一内存的错误!
也就是说,浅拷贝只是把新增加的指针指向同一片内存,而深拷贝则是自己额外开辟一片新的内存,把要拷贝的资源用strcpy或者memcpy函数拷贝到新的内存空间,并让新的指针指向它。
应此浅拷贝指向的是同一片内存,而深拷贝指向的是不同的内存。
下面来分析下深拷贝和浅拷贝的重要差别。
简单的来说就是,在有指针的情况下,浅拷贝只是增加了一个指针指向已经存在的内存,而深拷贝就是增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存,采用深拷贝的情况下,释放内存的时候就不会出现在浅拷贝时重复释放同一内存的错误!
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> using namespace std; class string { public: char *p; int length; string(int num,char *str)//构造函数 { //获取长度,分配内存,拷贝内容 length = num; p = new char[length]; memset(p, 0, length); strcpy(p, str); } string(const string &other)//拷贝构造函数 { //浅拷贝,//指向同一片内存 this->p = other.p; this->length = other.length; //深拷贝,//指向不同的内存 this->p = new char[other.length]; this->length = other.length; memset(p, 0, length); strcpy(this->p, other.p); } ~string() { delete []p;//销毁内存 } }; void main() { ::string *str1 = new ::string(10,"hello"); cout << str1->p << endl; ::string *str2 = new ::string(*str1); delete str1; cout << str2->p << endl; cin.get(); }
也就是说,浅拷贝只是把新增加的指针指向同一片内存,而深拷贝则是自己额外开辟一片新的内存,把要拷贝的资源用strcpy或者memcpy函数拷贝到新的内存空间,并让新的指针指向它。
应此浅拷贝指向的是同一片内存,而深拷贝指向的是不同的内存。
相关文章推荐
- Python动态类型的学习---引用的理解
- IE7降低内存和降低CPU的几个技巧
- 如何高效的使用内存
- DOS下内存的配置
- C#中使用DataContractSerializer类实现深拷贝操作示例
- XP/win2003下发现1G的内存比512M还慢的解决方法
- PowerShell实现动态获取当前脚本运行时消耗的内存
- C#中4种深拷贝方法介绍
- C#实现把dgv里的数据完整的复制到一张内存表的方法
- SQL语句实现查询SQL Server内存使用状况
- 简单谈谈C#中深拷贝、浅拷贝
- C语言内存对齐实例详解
- C++友元函数与拷贝构造函数详解
- 全局变量与局部变量在内存中的区别详细解析
- 浅拷贝和深拷贝深入理解(shallow copy VS deep copy)
- VB读取线程、句柄及写入内存的API代码实例
- php运行提示:Fatal error Allowed memory size内存不足的解决方法
- Python高级:细说Python浅拷贝和深拷贝
- js常用正则整理