【问题标题】:Does the struct get freed this way in C?结构是否在 C 中以这种方式被释放?
【发布时间】:2015-03-15 02:23:58
【问题描述】:

我有以下用于实现优先级队列的结构

struct q_element
{
    //Declaration of struct members
    int element;
    int priority;
    struct q_element *next_element;
};

我使用指向 struct 'cur' 的指针从队列中的第一项开始

struct q_element* cur = start_element;

并继续移动,直到找到要从列表中删除的那个。

while (cur->priority!=max_priority)
    cur = cur->next_element;

下面这行代码真的释放了这个结构吗?因为 'cur' 是指向我不完全确定的结构的指针。

free(cur);

【问题讨论】:

  • 如果你 malloc'd cur,那么是的,free(cur) 释放它。如果你没有,那么调用free 是一个错误。
  • 是的,因为你可以有 struct q_element x; struct q_element *ptr = &x; 等等,这将是非常不寻常但可能的,所以你必须解释如何生成列表,free(cur) 只会释放那个指针, next_elements 需要自己的 free()
  • 是的,我确实使用了 malloc.. 所以我没有以这种方式释放指针或其他任何东西? free 实际上释放了我给它的指针指向的结构?

标签: c pointers struct free


【解决方案1】:

您需要传递一个指向free 的指针,因此free(cur) 是可行的方法,假设struct 本身已使用malloc/calloc/realloc 分配。具体来说,如果您将 curr 分配在自动内存中(即在堆栈上),则不应在其上调用 free

看起来q_element 是链表的一部分。释放struct 本身不会释放它所指向的其他structs,所以如果你想将freestruct 连同它的尾巴一起释放,你需要编写一个循环。

最后,当您free 程序中的某个指针指向的内存时,最好将NULL 分配给您freed 的指针,以避免意外的双重释放和未定义的行为访问释放的内存。

【讨论】:

  • @Yiannis 在您的示例中,cur 是一个指向结构的指针。指针不是被释放的,而是指针指向的。如果cur指向的struct已经分配了calloc,那么free的调用是有效的。
猜你喜欢
  • 1970-01-01
  • 2020-04-22
  • 2023-03-29
  • 1970-01-01
  • 2017-05-07
  • 1970-01-01
  • 2014-01-04
  • 2021-06-16
  • 2021-07-30
相关资源
最近更新 更多