malloc并在C中免费
如果我有类似的东西
struct Node *root; struct Node *q; root = malloc( sizeof(struct Node)); q = root; free(q);
是节点q指向释放? 或者我必须将root
传递给free
函数?
root
和q
都具有相同的值,也就是说,它们指向相同的内存位置。 在调用free(q)
,它们都是悬空指针,因为它们指向的东西已被释放,但它们仍然指向该位置。
要取消引用要么会调用未定义的行为。 这包括free
拨打任何一个。
指针q
和root
指向赋值后的同一内存块。 因此,对free
的调用将释放该块, q
和root
都悬空。
你可以写
free(q);
要么
free(root);
可互换的
q == root
在调用free(q)
,释放的内存不会以任何方式被清除或擦除。
q
和root
仍然指向已分配的内存位置,但该内存位置被添加到空闲内存块列表中并可以重新分配。 您不能通过任何这些指针引用该内存位置,否则将调用未定义的行为。
free
调用后, q
和root
指向释放的内存块。
通常,每个资源只需发布一次。 这与C ++不同,在C ++中,您可以实现(但可能不应该)非常复杂的资源管理逻辑。