当前位置:   article > 正文

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

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

这里写图片描述
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)

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/728487
推荐阅读
相关标签
  

闽ICP备14008679号