唯一需要显示调用析构函数的情况:定位new

1.先上代码

class ding_wei_new
{
public:
	int x;
	~ding_wei_new()
	{
		cout << "调用了析构函数" << endl;
	}
};

//测试:
	//如果已经用 在堆区开辟了一个buf堆区空间,是否可以直接用这个空间
	int bufsize = 100;
	char* buf = new char[100];
	ding_wei_new *ptr = new (buf) ding_wei_new();  //在buf开辟的空间上继续使用
	cout << "buf的首地址: " << static_cast<const void*>(buf) << endl;
	cout << "ptr的首地址 : " << ptr << endl;  //果然它们的首地址是相同的
	//现在测试那个 定位new的问题
	//如果重复调用delete ptr 会导致重复释放
	//delete ptr;  --果然报错
	//只有一个可以解决的办法: 就是显示调用 对象的析构函数,释放这个对象可能存在的资源
	ptr->~ding_wei_new();
	delete[] buf;  //果然没有调用析构函数

2.其实,以上主要是因为如果只是释放buf指针的话,那么这个空间中的那个对象可能 存在一些资源,需要调用析构函数进行释放

3.但是,如果先调用delete[] ptr的话,确实会调用对象的析构函数,但是,当delete[] buf时,会造成重复释放的问题

4.所以,唯一的办法,就是在delete[]buf之前显示调用析构函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值