c++深拷贝与浅拷贝
来源:互联网 发布:什么是软件的ppt 编辑:程序博客网 时间:2024/05/22 04:43
先谈深拷贝与浅拷贝
如果类中存在变量或者对象,没有指针成员或者引用(即类没有资源,资源可以理解成动态申请的空间),可以使用默认的拷贝构造函数或者赋值运算符来实现浅拷贝。如果有指针,就不能这样默认的来实现。
深拷贝的思路,就是让目标对象与源对象的内存空间互相独立,相应的指针成员指向各自的内存空间,然后把源对象的数据完全复制到目标对象中去。
下边的例子:
#include <iostream>
using namespace std;
class CDeepCopy
{
public:
int n;
int *p;
CDeepCopy();
CDeepCopy(int);
~CDeepCopy();
//CDeepCopy(const CDeepCopy &r);
//CDeepCopy& operator = (const CDeepCopy& r);
};
CDeepCopy::CDeepCopy()
{
n = 0;
p = NULL;
}
CDeepCopy::CDeepCopy(int k)
{
p = NULL;
n = k;
p = new int[n];
}
CDeepCopy::~CDeepCopy()
{
static int num = 1;
//cout<<num++<<endl;
if (p != NULL)
{
delete [] p;
}
}
/*
CDeepCopy::CDeepCopy(const CDeepCopy &r)
{
n = r.n;
p = new int[n];
memcpy(p, r.p, n*sizeof(int));
}*/
/*
CDeepCopy& CDeepCopy::operator = (const CDeepCopy &r)
{
if (n != r.n)
{
n = r.n;
if (p != NULL)
{
delete [] p;
}
p = new int[n];
}
memcpy(p, r.p, n*sizeof(int));
return *this;
}*/
int main()
{
CDeepCopy a(2);
a.p[0] = 1;
a.p[1] = 2;
CDeepCopy b(a);
b.p[0] = 3;
b.p[1] = 4;
cout<<"a对象的两个值:"<<" "<<a.p[0]<<" "<<a.p[1]<<endl;
cout<<"b对象的两个值:"<<" "<<b.p[0]<<" "<<b.p[1]<<endl;
return 0;
}
结果分析:
把拷贝构造函数隐去:
结果为:a对象的两个值: 3 4
b对象的两个值: 3 4
然后是死机(死机的情况后边讨论)
使用拷贝构造函数后:
结果为:a对象的两个值: 1 2
b对象的两个值: 3 4
这样问题就浮现出来了,没使用拷贝构造函数,对象b中的指针p指向的地址是对象a中指针p指向的地址
现在就可以讨论没有拷贝构造函数后死机的情况了,在对象a的析构函数中将指针p申请的空间释放掉,但由于对象b中的指针p指向的是对象a中指针p指向的地址
在对象a执行完后,释放了空间。对象b又去释放对象a中指针p指向的地址,所以就死机了。
问题继续扩展:
如果将类中的析构函数给隐去,即不释放对象中指针申请的空间,那应该就不死机了。这种情况测试一样,结果和预想的一样,不死机了。
结果仍然是:a对象的两个值: 3 4
b对象的两个值: 3 4
然后不死机
这样很明显,造成了内存泄露。
总结:
深拷贝与浅拷贝区别就是让每个类对象的成员是否独立。
- c++-深拷贝与浅拷贝
- 【c++】浅拷贝与深拷贝
- Objective-C 深拷贝与浅拷贝
- [C++]深拷贝与浅拷贝
- C语言拾遗:位拷贝与值拷贝,浅拷贝与深拷贝
- C语言拾遗:位拷贝与值拷贝,浅拷贝与深拷贝
- 深拷贝与浅拷贝
- 深拷贝与浅拷贝
- 深拷贝与浅拷贝
- “浅拷贝”与“深拷贝”
- 深拷贝与浅拷贝
- 深拷贝与浅拷贝
- 深拷贝与浅拷贝
- 浅拷贝与深拷贝
- 深拷贝与浅拷贝
- 深拷贝与浅拷贝
- “浅拷贝”与“深拷贝”
- 深拷贝与浅拷贝
- 解读NTFS
- 工作重要,健康更重要:程序员保持健康的方法和经验
- spring配置多数据源
- 学习Delphi资源文件
- 一年如梦(四)
- c++深拷贝与浅拷贝
- Android中点中overlay气泡对话提示框效果
- 你会如何驾驭移动互联网快鱼吃慢鱼的时代?
- Software Model - 软件架构模式和设计模式
- c语言中各个符号修饰符的生命周期
- smoj—1036 最长不降子序列
- Android学习系列(4)--App自适应draw9patch不失真背景
- oracle 学习网址
- OFBiz