当ptr为NULL时,使用free(ptr)会破坏内存吗?

149

从理论上讲,我可以说

free(ptr);
free(ptr); 

由于我们正在释放已经被释放的内存,这是一种内存损坏。

但如果

free(ptr);
ptr=NULL;
free(ptr); 

由于操作系统会以未定义的方式表现,因此我无法进行实际的理论分析来确定正在发生什么。 无论我做什么,这是内存损坏还是不是?

释放空指针是否有效?


1
不确定C的自由标准,但在C++中delete(NULL)是完全有效的,所以我想free(NULL)也应该是有效的。 - Priyank Bolia
16
@Pryank:在C++中,“delete NULL”是无效的。Delete只能应用于具体类型的空指针值,而不能应用于“NULL”。 “delete (int*) NULL”是合法的,但“delete NULL”不是。 - AnT stands with Russia
这意味着如果一个指针指向NULL,free函数不会执行任何操作。这是否意味着!!!!在我们的编码中每次想要释放内存时,可以简单地用ptr=NULL替换free(ptr)? - Vijay
4
不。如果ptr指向内存,并且您没有调用free释放它,那么内存将泄漏。将其设置为NULL只是失去了对该内存的控制,并导致内存泄漏。如果ptr恰好是NULL,则调用free不会有任何操作。 - GManNickG
2
@benjamin:嗯?是什么让你得出可以用“ptr = NULL”替换“free(ptr)”的结论?没有人说过这样的话。 - AnT stands with Russia
显示剩余3条评论
11个回答

-5

ptr指向某个内存位置,比如说0x100。

当你使用free(ptr)时,基本上你允许0x100被内存管理器用于其他活动或进程,并简单地说它是资源的释放。

当你做ptr=NULL时,你让ptr指向新的位置(让我们不用担心NULL是什么)。这样你就失去了对0x100内存数据的跟踪。这就是所谓的内存泄漏。

因此,不建议在有效的ptr上使用ptr=NULL。

相反,你可以通过使用以下代码进行一些安全检查:

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

当你释放一个已经指向NULL的ptr时,它不会执行任何操作。所以这样做是安全的。


但是,如果内存已经被释放,如问题所述,则指针无效,并且应该设置为NULL,这样如果再次释放它,就不会出现双重释放错误。 - user16217248
顺序很重要。free(ptr); ptr=NULL;ptr=NULL; free(ptr);极其不同的。第一个释放了内存(变量的读写权限被撤销),然后移除了访问该内存的任何方式,这是完全安全和正常的(只要你不在将任何东西分配给ptr而不在未来为ptr分配新的内存)。第二个先移除了访问该内存的任何方式(ptr=NULL;),然后尝试访问它以撤销其权限(通过free(ptr))! - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接