delete 删除的是动态内存, 动态内存在操作系统中称做堆,它是操作系统的堆管理器来处理,堆有堆块组成分为 空闲的 使用的 ,当你new一片堆块的时候,它被标记为使用的 ,当你delete它的时候,它实际上把那片堆块重新标记为空闲的, 而不是删除内存空间, 虽然你还能使用它,但是如果程序中还有其它new运算,可能会把delete的那片堆块重新分配出去,因为delete后它是空闲的……
……我是菜鸟,希望能帮到你,观楼主英俊潇洒,风流倜傥,必当世豪杰,诚邀加入0x30百度贴吧,共商义举,建不世之功!http://tieba.baidu.com/f?ie=utf-8&kw=0x30
p指向的内存空间被释放不等于指向的内存空间被清除
空间被释放只是告诉系统此处空间是空闲的,可以放新的数据,就如同删除文件后并不将硬盘是的数据删除只是记录原数据位置是空,有新数据可覆盖此位置
C++ delete命令的原理如下:
delete也分为两种情况:
1,简单数据类型(包括基本数据类型和不需要析构函数的类型)。
[cpp] view plaincopy
int *p = new int(1);
delete p;
delete的汇编码如下:
[cpp] view plaincopy
delete p;
00275314 mov eax,dword ptr [p]
00275317 mov dword ptr [ebp-0D4h],eax
0027531D mov ecx,dword ptr [ebp-0D4h]
00275323 push ecx
00275324 call operator delete (0271127h)
分析:传入参数p之后调用operator delete,其源码如下:
[cpp] view plaincopy
void operator delete( void * p )
{
RTCCALLBACK(_RTC_Free_hook, (p, 0));
free( p );
}
RTCCALLBACK默认是空的宏定义,所以这个函数默认情况下就是简单的调用free函数。
总结:
delete简单数据类型默认只是调用free函数。
2,复杂数据类型(需要由析构函数销毁对象)
代码实例:
[cpp] view plaincopy
class Object
{
public:
Object()
{
_val = 1;
}
~Object()
{
cout << "destroy object" << endl;
}
private:
int _val;
};
void main()
{
Object* p = new Object;
delete p;
}
正常情况,就是这么设计的,指针仍然会指向已经被释放的空间。
还要加一句p=NULL