Code Bye

析构函数能不能显示调用

#include<iostream>
using namespace std;
class vectord{
private:
	double *zu;
public:
	vectord(){
		zu=new double [50];
	}
	~vectord(){
	  delete[] zu;
	  cout<<"qing";
	}
};
int _tmain(int argc, _TCHAR* argv[])
{
	vectord a;
	a.~vectord();
	system("pause");
	return 0;
}

运行就会提示Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

解决方案:5分
错误不在于 a.~vector();
局部变量在离开作用域的时候会自动析构,你有手动析构了一次,会造成对一个已经析构的对象再次析构,于是就出错了。
所以问题不在与手动调用析构函数,在于你不能阻止一个局部变量在退出作用域时对析构函数的调用。
===================
你可以在已经析构的对象的位置原地再创建一个对象,应该就不会出错了。
int _tmain(int argc, _TCHAR* argv[])
{
    vectord a;
    a.~vectord();
    system("pause");
    new(&a) vecterd;
    return 0;
}
解决方案:5分
本帖最后由 lianshaohua 于 2016-02-19 14:17:28 编辑

错误的原因应该是:手动调用一次析构函数,main结束时又调用一次析构函数;
那么调用两次会发生什么问题呢?
第一次析构之后:你的私有成员zu变成了野指针
第二次析构时:删除一个野指针,会出错;
解决办法,将析构函数修改如下:
~vectord(){
delete[] zu;
      zu=NULL;
cout<<“qing”;
}
这样修改后,应该不会出错了,但是调用了同一个对象的两次析构函数:手动一次,离开作用域时自动调用一次;
那么有没有办法避免自动调用的析构函数呢?答案是:有的。

解决方案:5分
对象析构时还会调用一次,这样一块内存你释放两次当然会出问题
一般不建议本人调用析构函数
就算要调用,释放内存后也将指针指向NULL
解决方案:5分
并不是不能够显式调用,你的代码不是已经显式调用了嘛。
报的错误是另外一个错误,和析构本身是无关的。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明析构函数能不能显示调用