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 

在这里插入图片描述

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