为了账号安全,请及时绑定邮箱和手机立即绑定

免费后将变量设置为NULL

免费后将变量设置为NULL

C
暮色呼如 2019-08-26 09:41:29
免费后将变量设置为NULL在我的公司中,有一个编码规则,在释放任何内存后,将变量重置为NULL。例如 ...void some_func () {     int *nPtr;     nPtr = malloc (100);     free (nPtr);     nPtr = NULL;     return;}我觉得,在上面显示的代码中,设置为NULL没有任何意义。或者我错过了什么?如果在这种情况下没有任何意义,我将采用“质量团队”来删除此编码规则。请指教。
查看完整描述

3 回答

?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

这被认为是避免覆盖内存的好习惯。在上面的函数中,它是不必要的,但通常在完成时它可以找到应用程序错误。

尝试这样的事情:

#if DEBUG_VERSIONvoid myfree(void **ptr){
    free(*ptr);
    *ptr = NULL;}#else#define myfree(p) do { void ** __p = (p); free(*(__p)); *(__p) = NULL; } while (0)#endif

DEBUG_VERSION允许您在调试代码中分析释放,但两者在功能上是相同的。

编辑:添加了...,如下所示,谢谢。


查看完整回答
反对 回复 2019-08-26
?
烙印99

TA贡献1829条经验 获得超13个赞

有两个原因:

双重释放时避免崩溃

由RageZ撰写的一个重复的问题。

c中最常见的错误是双重免费。基本上你做那样的事情

free(foobar);/* lot of code */free(foobar);

它最终非常糟糕,操作系统尝试释放一些已经释放的内存,通常是段错误。所以好的做法是设置NULL,所以你可以进行测试并检查你是否真的需要释放这些内存

if(foobar != NULL){
  free(foobar);}

还要注意的是,free(NULL) 不会做任何事情,所以你不必编写if语句。我不是一个真正的操作系统大师,但我现在甚至相当大多数操作系统会在双重免费时崩溃。

这也是为什么所有带垃圾收集的语言(Java,dotnet)为没有这个问题而感到骄傲的主要原因,也没有必要留给开发人员整个内存管理。

避免使用已经释放的指针

Martinv.Löwis在另一个答案中撰写。

将未使用的指针设置为NULL是一种防御方式,可防止悬空指针错误。如果在释放后访问悬空指针,则可以读取或覆盖随机存储器。如果访问空指针,则会在大多数系统上立即崩溃,立即告诉您错误是什么。

对于局部变量,如果在释放之后指针不再被访问是“显而易见的”,则可能有点无意义,因此这种样式更适合于成员数据和全局变量。即使对于局部变量,如果在释放内存后函数继续,也可能是一个好方法。

要完成样式,还应该在为指定真值指针值之前将指针初始化为NULL。


查看完整回答
反对 回复 2019-08-26
?
元芳怎么了

TA贡献1798条经验 获得超7个赞

将未使用的指针设置为NULL是一种防御方式,可防止悬空指针错误。如果在释放后访问悬空指针,则可以读取或覆盖随机存储器。如果访问空指针,则会在大多数系统上立即崩溃,立即告诉您错误是什么。

对于局部变量,如果在释放之后指针不再被访问是“显而易见的”,则可能有点无意义,因此这种样式更适合于成员数据和全局变量。即使对于局部变量,如果在释放内存后函数继续,也可能是一个好方法。

要完成样式,还应该在为指定真值指针值之前将指针初始化为NULL。


查看完整回答
反对 回复 2019-08-26
  • 3 回答
  • 0 关注
  • 410 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信