**delete this的问题**
class X
{
public:
~X()
{
cout < < "析构! " < <endl;
}
int Release()
{
delete this;
return 0;
}
void dosomethiing()
{
cout < < "你好! " < <endl;
}
};
int main()
{
X x;
x.Release();
x.dosomethiing();
return 0;
}
debug版下显示“析构”就出错
release 版下显示“析构”,“你好!”“析构”程序顺利结束
请问调用release这个函数,类对象到底被清理出内存没有呢??
[解决办法]
只有new出来的对象才能用delete清理。
你的x不是new出来的,所以不能delete this;。
[解决办法]
delete本应是先调用析构函数,然后归还内存。
但你这个对象是在栈上的,所以调用析构函数之后归还不了内存。
[解决办法]
成员函数不是因为对象而存在的,你的对象被销毁了,成员函数任然存在于代码段中.
但是如果你的成员函数中引用了非静态成员变量,那就会有问题了.
[解决办法]
你在debug出错是应该,在debug下当你delete一个空间的时候,会做有效检查
_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead-> nBlockUse));
然而你所要释放的不是一个有效的堆空间,所以断言
在release
不会有这个检查
[解决办法]
为什么x=NULL;后还能调用x的成员函数呢?我有点不解
--------------------------------------------------
因为你这个函数中没有用到this,该函数只是打印一个字符串而已,如果dosomething中用到this就肯定出错,比如,你打印一个数据成员。
[解决办法]
delete this的用法,只能用于在堆中生成的对象。栈中的对象在函数体结束后要自动析构一次,因此如果你先调用了release(),那么之后再析构就出问题了。
VC的debug模式下有对内存地址的断言,你已经回收了的内存,在第二次析构的时候又使用了一次,应该会断言错误。
Release模式下断言是无效的。
[解决办法]
通过NULL指针调用虚函数很可能会失败,因为对象的虚表要被访问。