当编译器利用默认的拷贝构造函数给你拷贝时,就是单纯的复制操作(浅拷贝)。
所以当我们成员属性中有指针指向堆里面的内存空间时,我们在调用完拷贝构造函数后,在结束时对在它们的析构函数中delete时会出现浅拷贝问题。
即一片空间已经被释放过了,你再次去释放它(非法访问)。
所以这个时候我们要做的事情是 利用深拷贝。
我们自己写拷贝构造函数,在调用拷贝构造函数时,我们将重新申请一块空间,将被拷贝的值放入这块空间内。
#include<iostream>
#include<string>
using namespace std;
class Student
{
public:
Student()
{
p_Name = new string;
*p_Name = "小明";
}
Student(const Student& s)
{
p_Name = new string(*s.p_Name);
}
~Student()
{
if (p_Name != NULL)
{
cout << "这里是构造函数的调用" << endl;
cout << "再看一眼你的成员属性吧" << endl;
cout << *p_Name << endl;
delete p_Name;
p_Name = NULL;
}
}
string get_answer()
{
return *p_Name;
}
private:
string* p_Name;
};
void test01()
{
Student st1;
Student st2(st1);
}
int main()
{
test01();
return 0;
}