浅拷贝与深拷贝

    在C++中,如果不显示声明拷贝构造函数的话,C++编译器会提供一个默认拷贝构造函数,这里的默认拷贝构造函数形成的效果就是浅拷贝。

    浅拷贝的意思即:如果是指针变量的话,只是将指针变量的内存地址复制给新对象中的指针变量,并未将指针指向的对象重新开辟内存空间,这样留下后患,形成野指针现象。

    通过程序测试如下:

Name(const char *myp)	//构造函数
	{
		m_len = strlen(myp);
		m_p = (char *)malloc(m_len + 1);
		strcpy(m_p, myp);
	}
	
~Name()	//析构函数
{
	if (m_p != NULL)
	{
		free(m_p);
		m_p = NULL;
		m_len = 0;
	}
}

//对象析构的时候 出现coredump
void objplaymain()
{
	Name obj1("abc");
	Name obj2 = obj1;  //C++编译器提供的默认的copy构造函数,即浅拷贝
} 

    下面提供一张图示以加强理解。


    注:当调用类似Name obj2=obj1;时,并未调用构造函数,只是调用了拷贝构造函数。

           当调用类似Name obj2;  obj2=obj1;时,调用了构造函数,生成了obj2对象,但是赋值时,还是浅拷贝。

    想要从根本上解决浅拷贝问题,就要显示提供拷贝构造函数,以及重载=操作符。代码如下。

//解决方案: 手工的编写拷贝构造函数 使用深copy
	Name(const Name& obj1)
	{
		m_len = obj1.m_len;
		m_p = (char *)malloc(m_len + 1);
		strcpy(m_p, obj1.m_p);
	}
    以后的编程生涯中,记住这两点对程序的正确性来说,是至关重要的。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值