我想在C中释放一棵大树。每个人可以有12个儿子。但是当我执行这段代码时,没有删除任何节点,我的计算机变慢了,并且在段故障后2-3分钟就结束了
void freeTheNodes(node_t *n)
{
for (int i = 0; i < 13; ++i) {
if (n->children[i] != NULL) {
freeTheNodes(n->children[i]);
}
}
free(n);
}
您是否了解我的代码无效的原因?
答案 0 :(得分:3)
for (int i = 0; i < 13; ++i)
将释放13个节点。将其更改为
for (int i = 0; i < 12; ++i)
答案 1 :(得分:3)
你说每个节点可以有12个孩子,但你试图删除13.这可能会解决你的一些问题。
也可能是您的树首先被腐败了 - 我们无法分辨,因为您没有提供该代码。
您的代码假定children
不为空 - 请确保这适用。
我很想把它写成:
void freeTheNodes(node_t *n)
{
if(n != NULL) {
for (int i = 0; i < CHILD_COUNT; ++i) {
freeTheNodes(n->children[i]);
}
free(n);
}
}
...只是因为它稍微简单一些(以递增更深层次的代价为代价)。
逐步调试您在调试器中运行的代码,看看它是否符合您的预期,并检查实际变量的实际内容。
使用electricfence
之类的工具也是一个好主意,这会导致程序在尝试读取/写入外部分配的内存时立即失败。我怀疑使用electricfence
你的程序会很快出错,而不是在失败之前运行几分钟。