深栈展开

Deep stack unwinding

首先,这肯定是关于C的,没有要求C++解决方案。

目标: Return 超出多个堆栈帧的调用函数 (A)。

我有一些解决方案,但感觉没有一个是最好的选择。

从实现的意义上来说最简单的是longjmp/setjmp,但我不确定 如果它破坏了自动变量,因为正如 wiki 所指,没有正常的堆栈展开 如果执行 longjmp,则参与。

这里是程序流程的简短描述: A 函数调用 file processing 函数,这导致许多内部 和递归调用。在某些时候,文件阅读器遇到了 EOF,所以 file processing 已完成,应将控制权交给 A 函数。

将每个读取的字符与 EOF 或“\0”进行比较?不,谢谢。 UPD:我可以避免在 setjmp 和 longjmp 之间的调用链中进行动态分配。

不确定自动变量,我不知道顺序调用会发生什么 到 file processing(有超过 1 个文件)。

所以:

1) longjmp 的 'no stack unwinding' 怎么样?如果我得到所有的东西会有多危险 可用的数据持有者(指针)。

2) 返回 A 框架的其他简洁有效的方法?

我不知道您在某处读到了什么,但是 setjmp/longjmp 正是为该任务预见的工具。

longjmp 重新建立 "stack" 完全(有点),就像它在调用 setjmp 时一样,对 "stack" 的所有修改两者之间完成的所有操作都丢失了,包括所有已定义的 auto 变量。这种栈的重新建立是brute forward,在C中没有析构函数的概念,这可能是"no stack unwinding".

的意思

我把 "stack" 放在引号中,因为这不是 C 标准适用的术语,它只讨论状态并允许按照实现的方式进行组织。

现在,从 setjmplongjmp 之间,您能够保留的唯一信息是:

  • 您传递给 longjmp
  • 的值
  • 您在 setjmp
  • 之前定义的已修改 volatile 对象的值

因此,在您从 longjmp 返回的分支中,您必须使用此(且仅此)信息来清理您的混乱:关闭文件,free 个您 malloced 的对象]等