4

我正在学习 gdb 调试器,我无法回答的一个问题是:新函数调用导致为它们分配额外的堆栈帧,并且调用堆栈向下增长;堆栈帧被释放并返回到未使用的内存。是否有可能删除堆栈中间的帧并返回内存?go to statement 或 longjmp 函数可以实现吗?

非常感谢。

4

1 回答 1

3

不,中间的frame不能删除,因为调用栈是一个栈。仅维护指向堆栈顶部的堆栈指针(以及指向最后一帧开头的可选帧指针)。由于帧被“删除”(从函数返回),只有这些指针被移动,下一个分配的帧将覆盖它。

这个线程(以及其他几个线程)解释了为什么 longjmp 不能违反这种行为。简而言之,setjmp 存储帧位置,但如果帧本身已被覆盖,则此操作失败。goto 不能跳转到不同的函数。

于 2014-03-13T07:46:42.940 回答