free和delete把指针怎么啦?

本文探讨了在C/C++中使用指针时常见的误解,包括指针消亡与内存释放的关系,以及如何正确地避免野指针问题。通过实例说明了即使指针指向的内存被释放,指针自身也不会变成NULL,如果不妥善处理可能会引发未定义行为。
别看free和delete的名字恶狠狠的(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。
用调试器跟踪示例7-5,发现指针p被free以后其地址仍然不变(非NULL),只是该地址对应的内存是垃圾,p成了“野指针”。如果此时不把p设置为NULL,会让人误以为p是个合法的指针。
如果程序比较长,我们有时记不住p所指的内存是否已经被释放,在继续使用p之前,通常会用语句 if (p != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用,

因为即便p不是NULL指针,它也不指向合法的内存块。

<span style="font-size:12px;">char *p=(char *)malloc(100);
strcpy(p,"hello");
free(p);//p所指的内存被释放,但是p所指的地址不变
if(p!=NULL)//没有起到作用
{
	strcpy(p,"world");//出错
}</span>



函数体内的局部变量在函数结束时自动消亡。很多人误以为示例7-6是正确的。理由是p是局部的指针变量,它消亡的时候会让它所指的动态内存一起完蛋。这是错觉!
<span style="font-size:12px;">void Func(void)
{
	char *p=(char *)malloc(100);//动态内存会自动释放么?
}</span>

我们发现指针有一些“似是而非”的特征: 
(1)指针消亡了,并不表示它所指的内存会被自动释放。
(2)内存被释放了,并不表示指针会消亡或者成了NULL指针。 

这表明释放内存并不是一件可以草率对待的事。也许有人不服气,一定要找出可以草率行事的理由:

如果程序终止了运行,一切指针都会消亡,动态内存会被操作系统回收。既然如此,在程序临终前,就可以不必释放内存、不必将指针设置为 NULL 了。终于可以偷懒而不会发生错误了吧? 


 想得美。如果别人把那段程序取出来用到其它地方怎么办? 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值