深浅拷贝问题

指针释放两次

再讲深浅拷贝之前先谈一谈如果对开辟内存的指针同时释放两次会发生什么情况

int *p = new int(10);//堆上开辟内存
	delete p;//释放完后成为野指针
	delete p;//泄漏

显然内存发生了泄漏,程序崩溃

深浅拷贝

在一个类中如果类中的成员变量不为指针时,不在堆上开辟内存,不会触及深浅拷贝问题,不需要担心深浅拷贝。
如下代码所示:

class B{
public:
	B()
	{ 
	}
	~B()
	{
	}
	int p;
};

类内在写指针并且开辟内存的时候需要特别注意深浅拷贝问题,往往忘记写拷贝构造,例如下所示,会造成内存泄漏问题

class B{
	int *p;//指针
public:
	B()
	{ 
		p = new int; //堆上开辟空间
	}
	~B()
	{
	delete p;//释放
	p = NULL;//指向null
	}

// 	B(const B& ths){
// 		p = new int;
// 		p = ths.p;
// 	}
};
int main()
{
	B c;//调用构造函数
	B b = c;//调用默认拷贝构造函数	
}//退出时调用析构函数释放内存,
//先调用b析构函数释放指针p指向的空间。
//再调用c析构函数释放指针p指向空间,由于两个p指向同一块空间,
//p被delete两次造成内存泄漏

在退出 m a i n ( ) main() main()函数时调用析构函数释放内存,先调用 b b b析构函数释放指针 p p p指向的空间。再调用 c c c析构函数释放指针 p p p指向空间,由于两个 p p p指向同一块空间, p p p d e l e t e delete delete两次造成内存泄漏
出现崩溃
在这里插入图片描述

补充

调用拷贝构造函数的情况

  • 一个对象初始化另一个对象 如: B b ( c ) , B b = c B b( c ), B b = c Bb(c),Bb=c;
  • 对象作为参数传入(传值,传引用不算)
  • 对象作为返回值传出

解决方法

为了解决该问题需要指向不同的内存空间,然后在调用的时候分别释放就不会引起这个问题,具体实现如下:

class B{
	int *p;
public:
	B()
	{ 
		p = new int(10); 
	}
	~B()
	{
		if (p != NULL)
		{
			delete p;
			p = NULL;
		}
	
	}

	B(const B& ths)//拷贝构造函数
	{
		p = new int;//重新开辟内存
		*p = *ths.p;//改变新内存指向的地址的内容
	}
};
int main()
{
	B c;//调用构造函数
	B b = c;//调用默认拷贝构造函数	
}

这样就能避免多次释放造成内存泄漏

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LV小猪精

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值