【问题标题】:Clear Linux Kernel Linked List清除 Linux 内核链表
【发布时间】:2012-07-27 14:44:54
【问题描述】:

我正在尝试修改一些使用 linux 内核中使用的 C 链表的代码,例如 fbida 中使用的this one。但我需要真正清除列表并从头开始,我不确定最安全的方法。网上也找不到例子。

关于如何安全清除列表并释放所有内存的任何想法?

【问题讨论】:

  • 为什么问题标记为 C++?只要this guy 对此事有任何发言权,您就不会发现 Linux 内核中使用的语言。
  • @MikeSeymour 我认为这是一个用户态程序,使用类似于 Linux 内核中使用的列表的实现。
  • @AdamHaile 当你有std::list 的力量时为什么要这样做?
  • 我正在修改我最初没有编写的代码。当前实现使用内核链表,所以我尝试使用相同的,否则我将不得不重写大部分内容。
  • 请参阅stackoverflow.com/questions/9207850/… 以获得此问题的正确答案。

标签: c++ c linux list


【解决方案1】:

也许我找到了答案(数字...) 会像下面这样工作吗?

void delete_all(struct list_head *head)
{
    struct list_head *iter;
    struct foo *objPtr;

  redo:
    __list_for_each(iter, head) {
        objPtr = list_entry(iter, struct foo, list_member);
        list_del(&objPtr->list_member);
        free(objPtr);
        goto redo;
    }
}

【讨论】:

  • 好吧,更具体地说,上面和你的实现有什么区别,@cnicutar?
  • 只有在使用 malloc、calloc、realloc(或其他兼容的分配例程)时才应该调用 free()。 MS有许多其他不兼容的。如果你转向 c++,你可能会使用“new”,这需要“delete”才能释放。
【解决方案2】:

“最安全的方式”...“释放内存”...引用的代码不进行分配,完全由调用者/实现者分配内存。因此,调用者/实现者必须释放分配的内存。

对于“cnicutar”来说,它只是一项简单的工作:遍历列表,调用 list_del(),对找到的每个项目执行函数,然后根据对象的分配方式释放或删除对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-27
    • 2015-05-29
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 2013-11-08
    • 1970-01-01
    相关资源
    最近更新 更多