Trie不成功删除

时间:2015-01-28 04:38:19

标签: c++ c data-structures

我有一个用C ++编写的Trie程序。删除Trie时出现问题。即使代码正在执行删除操作,内存也不会被释放。有人可以指出我做错了吗?程序不处理Trie中的单个字符串删除。下面是删除代码段。

void deleteTrie(trieNodeT **t) {
    if(*t) {
        trieNodeT *current = *t;
        for(int i=0; i<26; i++) {
            if(current->children[i]) {
                deleteTrie(&current->children[i]);
                free (current->children[i]);
            }
        }
    }
}

void deleteEntireTrie(trieCDT *t) {
    if (t) {
       deleteTrie(&t->root);
    }
} 

以下是整个源代码的链接:
https://ideone.com/xL7bvu

2 个答案:

答案 0 :(得分:0)

鉴于这是C ++:

(trieNodeT *) malloc(sizeof(trieNodeT));  

应该是:

new trieNodeT;

您不能将deletemalloc一起使用,它是未定义的行为。

或者,您可以替换:

delete current->children[i];

free(current->children[i]);

您可能还需要将null写入您要删除的内容:

if(current->children[i]) {
    deleteTrie(&current->children[i]);
    delete current->children[i];
    current->children[i] = nullptr; // or 0
}

答案 1 :(得分:0)

根节点的删除在哪里?

您无需使指针无效以使删除生效。使用delete语句删除内存“标记”。如果不使指针为空,则指针仍指向“已标记”的已删除内存区域。 C ++纯粹主义者会跳起来说我后面说的是错误的 - 在删除后立即通过旧指针访问内存,在许多实现中,数据仍然存在。因为内存块只是标记为已删除;没有被物理覆盖。但你永远不应该访问被删除的内存。程序会删除标记为已删除的内存,并在下次需要内存时将其分配出来;你没有任何控制权。使用多线程,即使“立即”,内存也可能消失。