我是否必须释放所有指向相同结构的指针?

时间:2014-10-08 12:09:59

标签: c pointers multidimensional-array linked-list free

我有一个使用单链表制作的类似数组的结构。如果我想删除某个单元格,我是否必须释放指向行和列的指针?

我的结构如下:

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 -> ...

2 个答案:

答案 0 :(得分:7)

不,你不会释放指针",你释放指针指向的内存。

如果您再考虑一下,这应该很容易理解。考虑这样的代码,这是对您所要求的简化视图:

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(),因为所有指针都指向同一块内存。

你只能 释放一块内存,它是未定义的行为,为同一地址多次调用free()(除非你在中间进行了新的分配当然)。

这当然是你应该学习的explained in the manual page

  

free()函数释放ptr指向的内存空间,该内存空间必须由之前调用malloc()calloc()realloc()返回。否则,或者如果之前已调用free(ptr),则会发生未定义的行为。如果ptrNULL,则不执行任何操作。

答案 1 :(得分:1)

不,实际上你必须两次释放同一个对象。如果你有两个指向某事的指针,一种方法是使用“共享指针”来引用计数;另一种方法是在数据结构中使用原始指针并管理其他地方的对象的生命周期。或者在您的特定情况下,您可以有一些约定,例如指针“在上面”是所有者而指向“左”的指针不是。

查看“双免费”,如果你释放两个指针,你会看到你会有什么样的错误。

顺便说一句,如果你释放一个空指针,什么都不做,所以处理这类事情的一种方法是在释放它们之后总是将指针设置为null。在你的情况下,这意味着将两个指针设置为null,当然,为了避免双重释放的可能性。