C++中深浅拷贝问题(构造函数)

构造函数主要分为:默认构造函数和有参构造函数;构造函数又分为:普通的构造函数和copy构造函数(需传入自身的对象)

利用自己定义的构造函数解决浅拷贝所带来的潜在的析构过程中的bug。

改程序中主要是利用重写copy构造函数,通过给对象在自由存储区(堆)重新分配自己的存储空间,来实现深copy,从而避免上述所提到的潜在bug。

 

#include <iostream>
using namespace std;

class Name
{
	public:
		Name(const char *myp)
		{
			m_len = strlen(myp);
			m_p = (char *) malloc (m_len + 1); //给指针分配内容空间
			strcpy(m_p, myp);
			}	
		//Name obj2 = obj1;
		//手动解决拷贝构造函数,使用深copy
		//指针的真正用武之地就是在运行时分配未命名的内存来储存值;c语言中使用malloc来分配,c++使用new运算符
		
		Name(const Name & obj1)
		{
			m_len = obj1.m_len;
			m_p = (char *)malloc(m_len + 1); //给指针分配内容空间
			strcpy(m_p, obj1.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 objdisplaymain()
{
	Name obj1("abcdefg");
	Name obj2 = obj1; //默认的copy构造函数 C++编译器给我们提供的 
}
//在程序调用结束时,会调用析构函数来回收内存,析构掉obj1和obj2两个对象。根据析构函数的操作,浅拷贝会出现bug
int main()
{
	objdisplaymain();
	cout << "hello..." << endl;
	return 0;
}

 

  

 

  

转载于:https://www.cnblogs.com/qkqBeer/articles/10724022.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值