版权声明: https://blog.csdn.net/qq_40794602/article/details/85163759
C++系统提供的拷贝构造函数是浅拷贝,只是简单的值拷贝
#include<iostream> using namespace std; class Test { public: int m_a; char *name; public: Test(const char *s,int n) { m_a = n; name = (char *)malloc(strlen(s) + 1); strcpy(name, s); } ~Test() { free(name); name = NULL; } }; int main() { Test p1("我爱罗", 12); Test p2 = p1; //会调用系统默认的拷贝构造函数,这是一个浅拷贝 //由于是浅拷贝,类属性里面有指针,然后这个类的析构函数里就会重复释放同一块内存空间两次,导致程序出现错误 return 0; }
这段代码会报错,是由于浅拷贝导致析构函数二次释放同一块内存空间导致
所以,当类里面有指针属性,且需要使用拷贝构造函数时,我们应该自己写一个拷贝构造函数,现在对以上代码进行修改(自己添加一个深拷贝构造函数)
#include<iostream>
using namespace std;
class Test
{
public:
int m_a;
char *name;
public:
Test(const char *s,int n)
{
m_a = n;
name = (char *)malloc(strlen(s) + 1);
strcpy(name, s);
}
Test(const Test& t) //自己写一个深拷贝构造函数
{
m_a = t.m_a;
name = (char *)malloc(strlen(t.name) + 1);
strcpy(name, t.name);
}
~Test()
{
free(name);
name = NULL;
}
};
int main()
{
Test p1("我爱罗", 12);
Test p2 = p1;
return 0;
}