#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分
错误的原因应该是:手动调用一次析构函数,main结束时又调用一次析构函数;
那么调用两次会发生什么问题呢?
第一次析构之后:你的私有成员zu变成了野指针
第二次析构时:删除一个野指针,会出错;
解决办法,将析构函数修改如下:
~vectord(){
delete[] zu;
zu=NULL;
cout<<“qing”;
}
这样修改后,应该不会出错了,但是调用了同一个对象的两次析构函数:手动一次,离开作用域时自动调用一次;
那么有没有办法避免自动调用的析构函数呢?答案是:有的。
解决方案:5分
对象析构时还会调用一次,这样一块内存你释放两次当然会出问题
一般不建议本人调用析构函数
就算要调用,释放内存后也将指针指向NULL
一般不建议本人调用析构函数
就算要调用,释放内存后也将指针指向NULL
解决方案:5分
并不是不能够显式调用,你的代码不是已经显式调用了嘛。
报的错误是另外一个错误,和析构本身是无关的。
报的错误是另外一个错误,和析构本身是无关的。