About delete

来源:互联网 发布:奇兔刷机软件有毒 编辑:程序博客网 时间:2024/06/03 19:25


一、删除自己

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




0 0
原创粉丝点击