如何使用免费删除链表

时间:2016-07-16 01:33:23

标签: c++ c list free

我有这些结构:

typedef struct tStimulus_tc
{
    short                Key;
    struct tStimulus_tc *Next;

}Stimulus_tc;

struct Frame_tc
{
    int                   ID;     // Frame ID (0..MAX)
    int                   Count;  // Felt Count
    short                 sSize;  // Stimulus List Size
    Stimulus_tc          *sList;  // Stimulus List

};

如果我想释放“struct Frame_tc”就够了吗?

void freeFrame (Frame_tc *fTemp)
{
    free(fTemp);
}

或者我需要通过它的刺激并逐一释放? 什么是释放变量的正确方法?

2 个答案:

答案 0 :(得分:2)

free()获取先前分配的块并将其释放以供重用。它不知道也不关心缓冲区的内容。

虽然您可以编写一个递归释放指针的编译器,但这不是一个好主意:

static Stimulus_tc stim;
Frame_tc *fTemp = malloc(sizeof *fTemp);
fTemp->sList = &stim;
fTemp->sSize = 1;
free(fTemp); // if this recursively freed pointers, we would free a static object

只有你知道你的结构是如何构建的,因此你应该是破坏它的人。在您的情况下,这意味着走链接列表并释放每个成员。

在C ++中,建议使用更高级别的机制,例如使用std::vector<Stimulus_tc>std::list<Stimulus_tc>

如果指针使用不可避免(您的情况不是一个),请考虑使用smart pointers。如果你绝对必须以旧方式管理记忆,use type-safe new[]/delete[]

答案 1 :(得分:2)

在C中,如果Stimulus_tc包装器中的struct Frame_tc列表不是传统的头/尾列表(例如,使用最终的->Next = NULL),但是包含的节点数量是list->sSize,你可以做类似以下的事情:

/* free all nodes in struct Frame_tc->Stimulus_tc list */
void free_list (struct Frame_tc *list)
{

    Stimulus_tc *iter = list->sList;    /* pointer to iterate list   */
    Stimulus_tc *victim = NULL;         /* pointer to node to delete */
    int n = list->sSize;                /* number of nodes to delete */

    if (iter ==  NULL) {
        fprintf (stderr,"print_list() warning: empty list.\n");
        return;
    }

    while (n--) {       /* free n nodes */
        victim = iter;
        iter = iter->Next;
        free (victim);
    }
}

如果您将最终Next指针设置为NULL,则可以取消int n = list->sSize;并使用while (iter) { ...

简单地遍历列表

如果在每个节点中分配了额外的指针元素,那么在free之前只需free (victim);这些值

仔细看看,如果您有任何问题,请告诉我。