从理论上讲,我可以说
free(ptr);
free(ptr);
由于我们正在释放已经被释放的内存,这是一种内存损坏。
但如果
free(ptr);
ptr=NULL;
free(ptr);
由于操作系统会以未定义的方式表现,因此我无法进行实际的理论分析来确定正在发生什么。 无论我做什么,这是内存损坏还是不是?
释放空指针是否有效?
从理论上讲,我可以说
free(ptr);
free(ptr);
由于我们正在释放已经被释放的内存,这是一种内存损坏。
但如果
free(ptr);
ptr=NULL;
free(ptr);
由于操作系统会以未定义的方式表现,因此我无法进行实际的理论分析来确定正在发生什么。 无论我做什么,这是内存损坏还是不是?
释放空指针是否有效?
ptr指向某个内存位置,比如说0x100。
当你使用free(ptr)时,基本上你允许0x100被内存管理器用于其他活动或进程,并简单地说它是资源的释放。
当你做ptr=NULL时,你让ptr指向新的位置(让我们不用担心NULL是什么)。这样你就失去了对0x100内存数据的跟踪。这就是所谓的内存泄漏。
因此,不建议在有效的ptr上使用ptr=NULL。
相反,你可以通过使用以下代码进行一些安全检查:
if(ptr != NULL) {free(ptr);}
当你释放一个已经指向NULL的ptr时,它不会执行任何操作。所以这样做是安全的。
NULL
,这样如果再次释放它,就不会出现双重释放错误。 - user16217248free(ptr); ptr=NULL;
和 ptr=NULL; free(ptr);
是极其不同的。第一个释放了内存(变量的读写权限被撤销),然后移除了访问该内存的任何方式,这是完全安全和正常的(只要你不在将任何东西分配给ptr
而不在未来为ptr
分配新的内存)。第二个先移除了访问该内存的任何方式(ptr=NULL;
),然后尝试访问它以撤销其权限(通过free(ptr)
)! - undefined
ptr
指向内存,并且您没有调用free
释放它,那么内存将泄漏。将其设置为NULL
只是失去了对该内存的控制,并导致内存泄漏。如果ptr
恰好是NULL
,则调用free
不会有任何操作。 - GManNickG