一、删除自己
void TestDeleteSelf()
{
class CTestDelete
{
public:
CTestDelete(){ iTest = 3; };
~CTestDelete(){};
void DeleteSelf()
{
delete this;
}
int iTest;
};
CTestDelete * pTest = new CTestDelete();
pTest->DeleteSelf();//正确。可以完成删除自己的操作。
CTestDelete test;
test.DeleteSelf();//出错;或卡死程序。 错误提示见下图。
}
依上代码可知:
1、使用对象指针回调一个对象时,允许被回调的对象在回调函数中删除自己。
2、如果使用对象而不是指针,则被回调的对象不能在回调函数中删除自己。
说明:
delete原语可以看作如下这样一个过程:(先调用对象的析构函数,然后调用delete释放内存)
p->~Object();
p->operator delete(p);
p->~Object() 语句调用p指向的Object对象的析构函数。
p->operator delete(p) 语句调用对象p的内存释放原语 void operator delete(void* p)。如果没有实现该方法,将调用系统的内存释放原语::operator delete(ptr)做释放该对象内存的操作。
析构函数本身是不会释放内存的, 除非在析构函数里面显示的使用delete操作符。
要使用delete this, 必须:
1、this对象是用 new分配的(不是用new[],也不是用定位放置 new,也不是一个栈上的局部对象,也不是全局的,也不是另一个对象的成员,而是明白的普通的new)。
2、该成员函数是this对象最后调用的的成员函数。
3、剩下的成员函数(delete this之后的)不接触到this对象任何一块(包括调用任何其他成员函数或访问任何数据成员)。
4、在delete this之后不再去访问this指针。
当指针是一个指向基类类型的指针,而没有虚析构函数时也不可以delete this。
注意:因为是在类成员函数里面delete this的,所以在此语句以后,不能访问任何的成员变量及虚函数(调用虚函数必须对象实例存在以检查类型),否则一定非法。
二、删除空指针
void TestDelete()
{
char* p = NULL;
delete p;//正确
}
可知:
可以delete空。即可以不检查p是否为空,直接删除。
ref:
http://hi.baidu.com/clivestudio/item/aaee71966b18cc37326eeb6e