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
- About delete
- About placement new and delete
- sample code about overloading new and delete
- Something More about "new" &"delete" in C++
- about 'Syntax error on token "Invalid Character", delete this token'
- about:
- about
- About
- About
- About
- DELETE
- delete
- delete
- DELETE
- delete
- delete
- delete
- Delete
- java中的变量
- 一些js应用
- 变态的libDispatch源码分析-全局队列异步延时任务处理过程-原理与创建ds
- 简单顺序链表
- 一个程序员应该具备的基础知识和概念
- About delete
- MySql避免重复插入记录
- 将一个十进制数转换为二进制输出
- ListView 特殊属性
- 黑马程序员——值类型与引用类型
- poj 2392 Space Elevator (多重背包)
- Extjs4.2 获取行数据的两种方法。
- mysql更改表结构:添加、删除、修改字段、调整字段顺序
- JNI 中 JAVA 与 C 数据类型装换 (1)