在我的公司中,有一个编码规则,在释放任何内存后,将变量重置为NULL.例如 ...
void some_func ()
{
int *nPtr;
nPtr = malloc (100);
free (nPtr);
nPtr = NULL;
return;
}
Run Code Online (Sandbox Code Playgroud)
我觉得,在上面显示的代码中,设置为NULL没有任何意义.或者我错过了什么?
如果在这种情况下没有任何意义,我将采用"质量团队"来删除此编码规则.请指教.
似乎有两个论点为什么人们应该NULL在释放它们之后设置指针.
简短:free()不小心召唤第二次,当它被设置为时,不会崩溃NULL.
几乎总是这掩盖了一个逻辑错误,因为没有理由free()第二次调用.让应用程序崩溃并能够修复它会更安全.
它不能保证崩溃,因为有时在同一地址分配新内存.
当有两个指向同一地址的指针时,主要发生双重自由.
逻辑错误也可能导致数据损坏.
短:malloc()除非释放指针设置为,否则访问释放的指针可能会导致数据损坏,如果在同一位置分配内存NULL
NULL如果偏移足够大(someStruct->lastMember,theArray[someBigNumber]),则无法保证在访问指针时程序崩溃.而不是崩溃将导致数据损坏.
将指针设置为NULL无法解决具有相同指针值的不同指针的问题.
随意扩展这个问题.
可能重复:
释放后将变量设置为NULL ...
我正在学习优秀的C编程实践,我的朋友告诉我在free()之后总是将指针设置为NULL(或调用特定的释放函数).
例如:
char* ptr = malloc(100);
...
free(ptr);
ptr = NULL;
Run Code Online (Sandbox Code Playgroud)
要么
struct graph* graph = create_graph();
...
destroy_graph(graph);
graph = NULL;
Run Code Online (Sandbox Code Playgroud)
为什么这是一个好习惯?
更新:看完答案后,对我来说这似乎是一个糟糕的做法!我隐藏了可能的double-free()错误.这怎么可能是一个好的做法?我很震惊.
谢谢,Boda Cydo.