c之如果有堆栈溢出,linux 会告诉我吗

unruledboy 阅读:22 2025-01-19 22:14:33 评论:0

请记住,我是 C 和 Linux 的新手。

在我的一个类(class)中,我有一个项目,在这个项目中,我们应该找到哪些城市位于某个地理框中,我们必须使用二叉搜索树,尽管实现取决于我们。在我的特定实现中,当向树中插入一个新元素时,我在适当的子树上递归调用插入函数。

我们还被告知要使用 Valgrind 检查我们的程序,因为它抛出的任何内存泄漏或错误都会对我们的成绩产生负面影响。我的程序运行良好,我们已经获得了 100,000 个城市文件,但是在 1,000,000 个城市中,Valgrind 向我抛出超过一百万个由无效读/写引起的错误,堆栈溢出。如果我以更高的堆栈大小运行 Valgrind,则不会发生这种情况。

当我在没有 Valgrind 的情况下直接运行程序时,我没有收到任何错误。如果有堆栈溢出,linux 会告诉我吗?这样的溢出会造成什么后果?

请您参考如下方法:

Would linux tell me if there was a stack overflow?

不,Linux 不关心您是否溢出堆栈。但是,它确实做了一些尝试以确保超出堆栈末尾的内存地址是未映射的内存,因此库存溢出可能会发生段错误。 (这取决于每个函数的堆栈帧的大小;如果运气不好,在堆栈上分配大数组可能会产生其他症状。)

C 运行时环境可能也不会告诉您,因为它需要插入额外的代码,这会减慢执行速度,然后注意确保堆栈不会溢出的程序员会提示支付保护您的代码免受错误影响的成本。这听起来可能很刺耳,但这基本上就是 C 语言的设计理念;如果您不喜欢它,还有其他语言。但是,一些编译器确实允许您请求插入额外的代码(对于 GCC,请参阅 -fstack-check 选项;另请参阅 -fstack-limit-*-fsplit-stack.)


标签:linux
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号