楼上的回答好像不太正确:
首先,delete p后,p仍然可用;
其次delete p不必和p=NULL连用。
delete用来释放new所进行的操作,可以把delete所进行的操作看为new的你操作。int *P = new int;中的new的作用是为指针p赋“初始地址”的,如你的程序中p被赋予了0x00570738的首地址,此时p指向这块内存。
也就是说new操作(new是操作符operator,不是函数)只是为了动态分配内存,创建new操作符的本意是为了delete,普通的指针赋值以后,如果不再使用,想要消除的话必须要等到它的固有生存期结束以后,这就会占用机器资源。
delete操作也只是new的内操作,并不能删除p,它只是把new得的内容释放掉,防止内存泄漏。程序中使用new,而不使用delete释放自己分配的内存会引起系统可以使用的内存数量不断减少。如果你的程序是一个不断运行的服务器的话,那么最终你的系统会因为没有足够的虚拟内存而要崩溃!但是只要你关闭那个泄漏内存的程序那么它没有释放的内存自动会释放。
delete p;包含了p=UNLL操作,此时*p=0(because p=NULL).很明显delete并不是真的把变量p给销毁了(p的生存期没有结束),而是释放它所指向的内存(节省机器资源),delete后的p还是一个整形指针,只不过此时的*p=0罢了。