delete指针后,只是释放了指针指向的内存空间,但是指针还在,并且指向之前的地址。
举个例子:
#include <iostream>
using namespace std;
int main()
{
int *p=new int;
*p=3;
cout<<"将3赋给p的地址后,指针p读取的值:"<<*p<<endl;
delete p;
cout<<"删除空间后,指针p读取的值:"<<*p<<endl;
long *p1=new long;
*p1=100;
cout<<"创建新空间后,指针p中保存的地址:"<<p<<endl;
cout<<"指向新空间的指针p1保存的地址:"<<p1<<endl;
*p=23;
cout<<"将23赋给p的地址后,指针p读取的值:"<<*p<<endl;
cout<<"将23赋给p的地址后,指针p1读取的值:"<<*p1<<endl;
delete p1;
return 0;
}
1.程序的第9行竟然可以输出被删除后p读取的值:-572662307。这里说明了一个重要的概念:我们删除一个指针后,编译器只释放它的内存空间,而不会删除这个指针本身。
2.在程序的第10行我们又创建了一个long型的指针p1。在12行与13行的输出中我们惊奇地发现,指针p保存的地址居然和指针p1保存的地址一模一样!这个就说明了指针p和指针p1都指向内存的同一个地方!!!出现这种状况的原因其实是由于编译器。编译器默认将释放掉的内存空间回收然后分配给新开辟的空间。
3.我们明明在程序的第11行中定义了*p1的值为100,但是在输出上面,指针p1读取的值竟然也是23。这个原因就是因为野指针p造成的。我们可以看到,在程序的第14行我们将23赋给了*p。又由于p和p1指向的是同一块内存单元,所以在这里相当于也将p1所指向的内存单元中的值(原来是100),改成了23!这样必然会导致程序的出错
所以在删除一个指针后,一定要将该指针设置成空指针!!(即在delete *p之后一定要加上: p=NULL)