【问题标题】:Do I have to free all the pointers to the same structure?我是否必须释放所有指向同一结构的指针?
【发布时间】:2014-10-08 12:09:58
【问题描述】:

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

我的结构是这样的:

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

【问题讨论】:

  • 类似矩阵的结构可能更明确,不是吗?或二维数组

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


【解决方案1】:

不,你没有“释放指针”,你释放了指针指向的内存。

这应该很容易理解,如果你再想一想的话。考虑这样的代码,它旨在简化您所要求的内容:

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,则不进行任何操作。

【讨论】:

  • 我还记得我的讲师说要经常检查,你使用的指针是否为空。这是避免双重免费问题的最简单方法。
  • @Theolodis 该链接适用于 C++。示例代码还从 malloc() 转换返回值。
  • @EvdzhanMustafa :不是不是。可能有两个指针指向同一个对象,就像在这个问题中一样。
  • @EvdzhanMustafa 不,这毫无意义,这表明您的讲师可能没有 100% 了解这些事情。防止free(NULL) 当然也没有来防止双重释放。
  • @wildplasser #include <stdlib.h> 显然是C。并且指针是否被投射并不重要。
【解决方案2】:

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

查找“双重释放”,你会看到如果你释放两个指针会出现什么样的错误。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    相关资源
    最近更新 更多