【问题标题】:Freeing a trie tree释放 trie 树
【发布时间】:2016-10-29 23:54:11
【问题描述】:

所以我在网上找到了一些特里树的例子,并尝试将它们用于帮助我正在开发的游戏,该游戏将包含字典中所有单词的特里树。我在网上找到的示例没有任何实现 freeTree 以避免内存泄漏,所以我正在尝试自己制作。但是我有一段时间没有使用 c 并且遇到了问题。

char keys[][8] = {"the", "a", "there", "answer", "any",
                 "by", "bye", "their"};
char output[][32] = {"Not present in trie", "Present in trie"};
struct TrieNode *root = getNode();

// Construct trie
int i;
for (i = 0; i < ARRAY_SIZE(keys); i++){
    insert(root, keys[i]);
}

// Search for different keys
printf("%s --- %s\n", "the", output[search(root, "the")] );
printf("%s --- %s\n", "these", output[search(root, "these")] );
printf("%s --- %s\n", "their", output[search(root, "their")] );
printf("%s --- %s\n", "thaw", output[search(root, "thaw")] );

freeTree(root);

printf("test after free\n");
printf("%s --- %s\n", "the", output[search(root, "the")] );
printf("%s --- %s\n", "these", output[search(root, "these")] );
printf("%s --- %s\n", "their", output[search(root, "their")] );
printf("%s --- %s\n", "thaw", output[search(root, "thaw")] );

这是我正在运行的一个简单测试,free之后的结果和之前一样

the --- Present in trie
these --- Not present in trie
their --- Present in trie
thaw --- Not present in trie
test after free
the --- Present in trie
these --- Not present in trie
their --- Present in trie
thaw --- Not present in trie

这是我使用的结构

struct TrieNode
{
    struct TrieNode *children[ALPHABET_SIZE];
    bool isLeaf;
};

以及免费实施

void freeChildren(struct TrieNode *node){
    int i;
    if (node->isLeaf == false){
      for (i=0;i<ALPHABET_SIZE;i++){
         if (node->children[i] != NULL){
            freeChildren(node->children[i]);
         }
      }
    }

   if (node != NULL){
      node = NULL;
      free(node);
   }
}

void freeTree(struct TrieNode *root){
  freeChildren(root);
  free(root);
}

当我创建一个新的树节点时,我会为其分配内存,以便我知道我需要释放。

【问题讨论】:

    标签: c trie


    【解决方案1】:

    我认为你的问题是这部分:

    if (node != NULL){
      node = NULL;
      free(node);
    }
    

    好吧,您需要释放它然后将其设置为 NULL。否则无论如何你已经丢失了地址。

    【讨论】:

      【解决方案2】:
      void freeChildren(struct TrieNode *node){
          int i;
          if (node != NULL && node->isLeaf == false){//NULL check important only for the root
            for (i=0;i<ALPHABET_SIZE;i++){
               if (node->children[i] != NULL){
                  freeChildren(node->children[i]);
                  node->children[i] = NULL]; //you have to remove the address, otherwise it stays, just is no longer allocated (but it is still possible to access it, though it might crash or do whatever else)
               }
            }
          }
      
          if (node != NULL){ //again only root could be NULL
            free(node);//this has to go first
            //node = NULL; this has no meaning, as this is the local variable, not the place you passed it to
         }
      }
      
      void freeTree(struct TrieNode *root){
        freeChildren(root);
        // free(root); this is already done in the freeChildren
        // you might want to realloc the root there though, as otherwise you don't have anything allocated to root
        root = NULL;
      }
      

      【讨论】:

      • 感谢您的响应现在有效!评论非常清晰,内容丰富,谢谢!
      猜你喜欢
      • 2017-12-21
      • 2016-04-13
      • 2018-01-17
      • 1970-01-01
      • 1970-01-01
      • 2017-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多