C 我必须释放指向同一结构的所有指针吗?

C 我必须释放指向同一结构的所有指针吗?,c,pointers,multidimensional-array,linked-list,free,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

我有一个类似数组的结构,它使用单链表。如果要删除某个单元格,是否必须释放指向该单元格的指针(按行和按列)

我的结构如下所示:

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

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

查找“double free”,您将看到如果同时释放这两个指针,会出现什么样的错误


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

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

查找“double free”,您将看到如果同时释放这两个指针,会出现什么样的错误

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

不,您没有“释放指针”,而是释放指针指向的内存

这应该很容易理解,如果你再仔细想想的话。考虑这样的代码,这意味着你要问的是一个简化的视图:

void *ptr = malloc(1024); /* Allocate 1024 KB of memory, somewhere. */
void *copy1 = ptr;
void *copy2 = ptr;
void *copy3 = ptr;
void *copy4 = ptr;
当上述操作运行时,假设分配成功,我们显然有五个指向同一内存块的指针。我们可以使用五个指针中的任何一个来取消分配内存,因为它们的值是相同的:

当然,我们不能使用多个指针调用
free()
,因为所有指针都指向同一内存块

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

这当然是你真正应该学习的:

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

不,你不是“释放指针”,而是释放指针指向的内存

这应该很容易理解,如果你再仔细想想的话。考虑这样的代码,这意味着你要问的是一个简化的视图:

void *ptr = malloc(1024); /* Allocate 1024 KB of memory, somewhere. */
void *copy1 = ptr;
void *copy2 = ptr;
void *copy3 = ptr;
void *copy4 = ptr;
当上述操作运行时,假设分配成功,我们显然有五个指向同一内存块的指针。我们可以使用五个指针中的任何一个来取消分配内存,因为它们的值是相同的:

当然,我们不能使用多个指针调用
free()
,因为所有指针都指向同一内存块

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

这当然是你真正应该学习的:

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


类似矩阵的结构可能更明确,不是吗?或者2D arrayA矩阵式结构可能更明确,不是吗?或者2D arrayI还记得我的讲师说过要经常检查,你在free上使用的指针实际上是否为空。这是最简单的方法,不可能得到双自由问题。@链接是C++的。示例代码还从malloc()强制转换returnvalue。@EvdzhanMustafa:not。可能有两个指针指向同一个对象,就像这个问题一样。@EvdzhanMustafa不,那只是毫无意义,这表明你的讲师可能没有100%地掌握这些东西。防止
自由(NULL)
当然也不能防止双重自由。@wildplasser
#include
显然是C。不管指针是否被铸造。我仍然记得我的讲师说过要经常检查,你使用的自由指针是否是空的。这是最简单的方法,不可能得到双自由问题。@链接是C++的。示例代码还从malloc()强制转换returnvalue。@EvdzhanMustafa:not。可能有两个指针指向同一个对象,就像这个问题一样。@EvdzhanMustafa不,那只是毫无意义,这表明你的讲师可能没有100%地掌握这些东西。防止
自由(空)
当然也不能防止双重自由。@wildplasser
#include
显然是C