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之前显示调用析构函数