浅拷贝拷贝的仅仅是指向被复制的内存地址,如果原地址中对象被改变了,那么浅拷贝出来的对象也会相应的改变
#include <string.h>
#include <iostream>
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) { //拷贝构造函数
//浅拷贝,当对象的name和传入对象的name指向相同的地址
name = s.name;
//深拷贝
// name = new char(20);
// memcpy(name, s.name, strlen(s.name));
cout << "copy Student" << endl;
};
};
int main() {
{
// 花括号让s1和s2变成局部对象,方便测试
Student s1;
Student s2(s1); // 复制对象
}
// system("pause");
return 0;
}
浅拷贝输出结果:
Student
copy Student
~Student 0x7ffc4d529438
~Student 0x7ffc4d529428
*** Error in `./test': double free or corruption (fasttop): 0x0000000001abac20 ***
浅拷贝在对象的拷贝创建时存在风险,即被拷贝的对象析构释放资源之后,拷贝对象析构时会再次释放一个已经释放的资源,深拷贝的结果是两个对象之间没有任何关系,各自成员地 址不同。