我有一个用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(¤t->children[i]);
free (current->children[i]);
}
}
}
}
void deleteEntireTrie(trieCDT *t) {
if (t) {
deleteTrie(&t->root);
}
}
以下是整个源代码的链接:
https://ideone.com/xL7bvu
答案 0 :(得分:0)
鉴于这是C ++:
(trieNodeT *) malloc(sizeof(trieNodeT));
应该是:
new trieNodeT;
您不能将delete
和malloc
一起使用,它是未定义的行为。
或者,您可以替换:
delete current->children[i];
与
free(current->children[i]);
您可能还需要将null写入您要删除的内容:
if(current->children[i]) {
deleteTrie(¤t->children[i]);
delete current->children[i];
current->children[i] = nullptr; // or 0
}
答案 1 :(得分:0)
根节点的删除在哪里?
您无需使指针无效以使删除生效。使用delete语句删除内存“标记”。如果不使指针为空,则指针仍指向“已标记”的已删除内存区域。 C ++纯粹主义者会跳起来说我后面说的是错误的 - 在删除后立即通过旧指针访问内存,在许多实现中,数据仍然存在。因为内存块只是标记为已删除;没有被物理覆盖。但你永远不应该访问被删除的内存。程序会删除标记为已删除的内存,并在下次需要内存时将其分配出来;你没有任何控制权。使用多线程,即使“立即”,内存也可能消失。