C++中delete指针后,要将其赋值为NULL的具体原因

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)

猜你喜欢

转载自blog.csdn.net/c243311364/article/details/81284687