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

本文通过实例演示了C++中指针的使用及其潜在风险,特别是指针删除后的行为及为何应当将其置为空指针。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值