首先我们举例浅拷贝
#include <iostream>
using namespace std;
class Student {
public:
Student();
~Studnet();
private:
int num;
char *name;
}
Student::Student()
{
name = new char(20);
cout << "Student构造函数" << endl;
}
Student::~Student()
{
delete name;
name = nullptr;
cout << "Studnet的析构函数" << (int)name << endl;
}
int main() {
Studnet s1;
Student s2(s1);
return 0;
}
会输出一个构造函数,两个析构函数,且两个析构函数地址相同
name指针开辟一次内存,但是被delete了两次,会导致程序崩溃;
系统会调用默认拷贝构造函数,把指针拷贝了一次,相当于两个指针指向同一个内存;
接下来是深拷贝
#include <iostream>
using namespace std;
class Student
{
public:
Student();
~Student();
Student(const Student &s);
private:
int num;
char *name;
}
Student::Student()
{
name = new char(10);
cout << "Studnet的构造函数" << endl;
}
Student::~Student()
{
delete name;
name = nullptr;
cout << "Student的析构函数" << (int)name << endl;
}
Student::Student(const Student &s)
{
name = new char(20);
memcpy(name, s.name, strlen(s.name));
cout << "拷贝构造函数" << endl;
}
int main()
{
Studnet s1;
Student s2(s1);
return 0;
}
一次构造函数,一次拷贝构造韩式,两次析构函数,两次析构函数的地址不同