较大尝试的递归释放



我编写了一个基本函数,用于在 C 语言中递归地释放 trie 数据结构:

// Root pointer is passed as arg in initial call
void destroy(node *trav)
{
for (int i = 0; i < N; i++)
{
if (trav->children[i])
{
destroy(trav->children[i]);
}
}
free(trav);
}

此功能似乎可以很好地处理任何较小的字典文件。程序成功加载和卸载的最大文件包含 134,480 个单词。

但是,在解除分配较大的尝试时,它会产生分段错误。导致分段错误的较大文件包含 506,915 个单词。

Valgrind 生成的错误消息指出:"大小为 8 的无效读取",然后是几个回溯,最后;"地址不是堆叠的、恶意的或(最近(释放的"。

可能是什么原因造成的?

可能是什么原因造成的?

堆栈溢出可能导致这种情况,尽管这似乎不太可能:几乎没有局部变量,所以每个帧可能只消耗 32 字节的堆栈,这将允许使用 Linux 默认的 8MiB 堆栈递归 8M/32 == 262144 级深度。

但是,如果您的尝试非常不平衡,则可能会溢出堆栈。

您可以尝试ulimit -s unlimited,看看这是否会使问题消失。

或者,您可以在 GDB 下运行程序,并检查报告SIGSEGV的指令。如果是CALLPUSH或其他形式的"移动到堆栈",堆栈溢出也很有可能。

相关内容

  • 没有找到相关文章