如何释放TRIE?

时间:2017-07-16 13:56:00

标签: c pointers free trie

我目前正在使用拼写检查程序(根据CS50s pset5,对于那些知道它的人)。我正在使用TRIE进行搜索,但现在我正在卸载它。该函数第一次尝试free()时失败。我的猜测是它试图释放指针而不是指针指向的东西,但我可能完全错了。

我的具体问题是:为什么free()功能失败? (错误:双重释放或损坏(输出):0x00000000006020c0 ***)

我对节点的定义:

typedef struct node
{
    bool wordHere;
    struct node* children[27];
}node;

我的卸载功能:

node* currentNodePtr = &root;
bool unload(void)
{
    node* ptrArray[27] = {NULL};

    for(int i = 0; i < 27; i++)
    {
        ptrArray[i] = currentNodePtr -> children[i];
    }

    free(currentNodePtr);

    for(int c = 0; c < 27; c++)
    {
        if(ptrArray[c] != NULL)
        {
            currentNodePtr = ptrArray[c];
        }

        unload();
    }

    return 0;
}

2 个答案:

答案 0 :(得分:2)

似乎没有动态分配对象root

因此指针currentNodePtr不指向动态分配的对象。

node* currentNodePtr = &root;

因此你可能不会打电话

free(currentNodePtr);

用于此指针。

您必须最初将对象root动态分配为任何其他节点。

第二个问题,你必须在if语句中包含函数的递归调用

    if(ptrArray[c] != NULL)
    {
        currentNodePtr = ptrArray[c];
        unload();
    }

因为在函数的开头你不检查指针是否等于NULL

虽然在函数开头检查指针currentNodePtr不等于NULL会更好。

当函数使用全局变量时,也不是一个好主意。而不是使用全局变量currentNodePtr使其成为函数的参数。

答案 1 :(得分:0)

感谢大家!问题是,根节点没有动态分配。 我不确定我应该如何动态分配根,所以我使用了这个简单的(虽然不是很优雅)修复:

node* currentNodePtr = &root;
bool unload(void)
{
    node* ptrArray[27] = {NULL};

    for(int i = 0; i < 27; i++)
    {
        ptrArray[i] = currentNodePtr -> children[i];
    }

    if(currentNodePtr != &root)
    {
        free(currentNodePtr);
    }


    for(int c = 0; c < 27; c++)
    {
        if(ptrArray[c] != NULL)
        {
            currentNodePtr = ptrArray[c];
            unload();
        }

    }

    return true;
}