gpt4 book ai didi

c - C 中的 abort() 函数是否清理堆栈?

转载 作者:太空狗 更新时间:2023-10-29 17:03:50 26 4
gpt4 key购买 nike

可以捕获 SIGABRT 并使用跳远继续程序。

我想知道当我总是调用调用 abort() 的函数时,这是否会导致堆栈溢出。

我需要知道这一点,因为我想在单元测试中使用断言宏(taht 调用中止)。如果断言失败,我想继续进行下一个单元测试。

最佳答案

abort 不需要清栈; longjmp 将“清除”它,因为它将堆栈指针倒回到 setjmp 的位置。如果一切正常,重复调用 longjmpsetjmp 不会导致堆栈溢出。

但是,longjmp 会跳过正常的执行路径,这本身就可以调用资源泄漏。考虑这段代码:

char *s = malloc(...);
... use s ...
free(s);

如果“...使用...”部分调用了一些 longjmp 代码外的函数,free 将没有机会获得打电话,你会泄漏。这同样适用于关闭打开的文件、套接字、释放共享内存段、回收 fork 的 child 等等。

因此 longjmp 在 C 编程中很少使用。如果您不想程序退出,我的建议是避免使用 assert。只需在单元测试中使用另一个宏,或切换到提供宏的测试框架。

关于c - C 中的 abort() 函数是否清理堆栈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14480749/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com