我有一个使用单链表制作的类数组结构。如果我想删除某个单元格,我是否必须按行和按列释放指向它的指针?
我的结构是这样的:
S -> C0 -> C1 -> C2 -> ...
v v v
R0 -> 00 -> 01 -> 02 -> ...
v v v
R1 -> 10 -> 11 -> 12 -> ...
v v v
R2 -> 20 -> 21 -> 22 -> ...
然后说我想删除 11 并重新链接。我必须使用 01 和 10 中的指针释放 11 吗?
S -> C0 -> C1 -> C2 -> ...
v v v
R0 -> 00 -> 01 -> 02 -> ...
v v v
R1 -> 10 ->->v->->12 -> ...
v v v
R2 -> 20 -> 21 -> 22 -> ...
最佳答案
不,你不是“释放指针”,而是释放指针指向的内存。
如果您再仔细想想,这应该很容易理解。考虑这样的代码,它是您所问内容的简化 View :
void *ptr = malloc(1024); /* Allocate 1024 KB of memory, somewhere. */
void *copy1 = ptr;
void *copy2 = ptr;
void *copy3 = ptr;
void *copy4 = ptr;
当上面的代码运行时,假设分配成功,我们显然有五个指针指向同一个内存块。我们可以使用五个指针中的任何一个来取消分配内存,因为它们的值相同:
free(ptr3); /* Any one would work. */
当然,我们不能使用多个指针调用 free()
,因为所有指针都指向同一 block 内存。
您只能释放一个内存块一次,为同一地址多次调用free()
是未定义的行为(除非您在-当然在之间)。
这当然是explained in the manual page你真的应该学习:
The
free()
function frees the memory space pointed to by ptr, which must have been returned by a previous call tomalloc()
,calloc()
orrealloc()
. Otherwise, or iffree(ptr)
has already been called before, undefined behavior occurs. Ifptr
isNULL
, no operation is performed.
关于c - 我是否必须释放所有指向同一结构的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26256567/