22深拷貝和淺拷貝

/*
	默認複製構造函數可以完成對象的數據成員值簡單的複製
	對象的數據資源是由指針指示的堆時,默認複製構造函數僅作指針值複製
	
淺拷貝程序C++提供的解決方法:
	顯示提供copy構造函數
	顯示操作重載=號操作,不使用編譯器提供的淺copy
*/

#if 1
class Name
{
public:
	//構造函數
	Name(const char *myp)
	{
		m_len = strlen(myp);
		m_p = (char *)malloc(m_len + 1);
		strcpy(m_p, myp);
	}

	//Name t2 = t1;
	//解決方案:手工的編寫拷貝構造函數 使用深copy
	Name(const Name& obj)
	{
		m_len = obj.m_len;
		m_p = (char *)malloc(m_len + 1);
		strcpy(m_p, obj.m_p);
	}


	~Name()
	{
		if (m_p != NULL)
		{
			free(m_p);
			m_p = NULL;//釋放完內存要置空
			m_len = 0;
		}
	}

protected:
private:
	char *m_p;
	int m_len;

};
void test()
{
	Name t1("hello world"); //調用無參構造函數
	Name t2 = t1;//c++編譯器提供的默認拷貝構造函數 是 淺拷貝,多次釋放 同一塊內存

	//----------------------------------------------------------
	Name t3("hhhh");
	//t3 = t1;	// = 操作 把對象1的屬性 拷貝給對象3  是淺拷貝,多次釋放 同一塊內存,還有一塊內存未釋放
	//需要解決重載 = 操作符
	cout << "hello..." << endl;
}

#endif 

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章