1. 程式人生 > >C++淺拷貝和深拷貝

C++淺拷貝和深拷貝

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;
}