免费后将变量设置为NULL

免费后将变量设置为NULL

在我的公司中,有一个编码规则,在释放任何内存后,将变量重置为NULL。例如 ...

void some_func () {
    int *nPtr;

    nPtr = malloc (100);

    free (nPtr);
    nPtr = NULL;

    return;}

我觉得,在上面显示的代码中,设置为NULL没有任何意义。或者我错过了什么?

如果在这种情况下没有任何意义,我将采用“质量团队”来删除此编码规则。请指教。


暮色呼如
浏览 411回答 3
3回答

一只甜甜圈

这被认为是避免覆盖内存的好习惯。在上面的函数中,它是不必要的,但通常在完成时它可以找到应用程序错误。尝试这样的事情:#if DEBUG_VERSIONvoid myfree(void **ptr){     free(*ptr);     *ptr = NULL;}#else#define myfree(p) do { void ** __p = (p); free(*(__p)); *(__p) = NULL; } while (0)#endifDEBUG_VERSION允许您在调试代码中分析释放,但两者在功能上是相同的。编辑:添加了...,如下所示,谢谢。

烙印99

有两个原因:双重释放时避免崩溃由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。

元芳怎么了

将未使用的指针设置为NULL是一种防御方式,可防止悬空指针错误。如果在释放后访问悬空指针,则可以读取或覆盖随机存储器。如果访问空指针,则会在大多数系统上立即崩溃,立即告诉您错误是什么。对于局部变量,如果在释放之后指针不再被访问是“显而易见的”,则可能有点无意义,因此这种样式更适合于成员数据和全局变量。即使对于局部变量,如果在释放内存后函数继续,也可能是一个好方法。要完成样式,还应该在为指定真值指针值之前将指针初始化为NULL。
打开App,查看更多内容
随时随地看视频慕课网APP