浅拷贝和深拷贝
1、对于值类型,无论浅拷贝还是深拷贝,都只做简单的值拷贝
2、对于指针或引用类型:
(1)浅拷贝仍只做简单的值拷贝,即拷贝指针或引用保存的指向内容的地址,使得拷贝后的对象与原对象指向同一块内存,这样容易出现内存泄漏(一个对象回收指向的内存后,另一个访问它造成非法访问),适用于拷贝不含指针或引用类型的对象;
(2)深拷贝会拷贝原对象指向的内存区,即不与原对象共享同一块内存,是一个独立的副本,不会与原对象互相影响,缺点是当拷贝的对象很大时,很占用内存等资源
注:一般系统自动生成的拷贝构造函数都是浅拷贝,深拷贝需要自己实现。
代码举例:
#include <iostream>
#include <string.h>
using namespace std;
class Student
{
private:
int num;
char* name;
public:
Student() {
name = new char(20);
cout << "Student" << endl;
};
~Student() {
cout << "~Student " << &name << endl;
delete name;
name = NULL;
};
//拷贝构造函数
Student(const Student& s) {
//浅拷贝,this的name和入参的name指向相同的地址
name = s.name;
//深拷贝
/*
name = new char(20);
memcpy(name, s.name, strlen(s.name));
*/
cout << "copy Student" << endl;
};
};
int main()
{
{
Student s1; // 构造
Student s2(s1);// 拷贝
//析构s1、s2对象
}
system("pause");
return 0;
}
运行结果:
浅拷贝触发断点,显示是在释放内存时出现错误。编译器会先析构s2再析构s1,即析构s1时出现要释放已被释放内存的现象
深拷贝正常运行