【问题标题】:Deallocating linked list释放链表
【发布时间】:2014-09-15 01:14:29
【问题描述】:

这个解决方案足以解除链表的分配吗? 如何验证它正在释放分配给列表的内存?

void freeList(EmpList** listHead)
{
    EmpList* iter = *listHead;
    while(iter != NULL)
    {
        iter = iter->next;
        free(*listHead);
        *listHead = iter;
    }

}

这是结构

typedef struct employeeData
{
    int EMP_ID;
    char name[21];
    int dept;
    int rank;
    double salary;
} Employee;

typedef struct empList
{
    Employee employee;
    struct empList* next;
} EmpList;

【问题讨论】:

  • 为什么要将EmpList * *(指向指针的指针)传递给函数?
  • 我相信调用者可以定义EmpList *head,然后将head自动设置为NULL(通过调用freeList(&head)。)
  • 在我的实现中,并不是说我做对了,所以如果它错了请说出来,但是为了改变 listHead 我需要一个指针,因为我没有取消引用 listhead 的数据,而是而是指向列表的指针。 Neo 说了什么
  • 也许这就是目的(尽管我认为它的风格很糟糕)。但是freeList 没有设置为NULL
  • 根据循环的工作方式,当循环结束时,它将是 *listHead == NULL

标签: c memory-management linked-list


【解决方案1】:

您可以验证使用 Valgrind 等内存检查器释放内存。如果您留下任何内存悬空,内存检查器将在程序执行结束时通知您。此外,Valgrind 可以检查各种内存滥用(超出数组末尾、使用已释放内存、未初始化内存以及更多功能)。

至于你的实现,看起来很合理。

【讨论】:

  • 谢谢,我会研究一下 Valgrind,这很有用......哈哈,如果你忘记关闭文件,它会告诉你吗,我这样做比任何事情都多。
  • 确实如此!有关选项的完整列表,请参阅 valgrind.org/docs/manual/manual-core.html。你要的是--track-fds
  • neo ive 我在运行 valgrind 时收到大小为 8 的无效写入/读取,这很糟糕吗?当程序结束时,它说堆堆栈为 0。
  • 无效的写入和读取都是不好的。这可能意味着您在释放内存后访问它,这是一个禁忌。
  • 是的,我发现我分配的是 sizeof(Employee) 而不是 sizeof(EmpList)
猜你喜欢
  • 2013-10-30
  • 1970-01-01
  • 2021-09-24
  • 2021-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-23
  • 2016-07-22
相关资源
最近更新 更多