C++浅拷贝和深拷贝

版权声明: 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;
}

猜你喜欢

转载自blog.csdn.net/qq_40794602/article/details/85163759