我正在尝试进行一些高度递归的模拟和数学运算,在某些边缘情况下,我会溢出调用堆栈并获得EXC_BAD_ACCESS信号。将算法更改为迭代形式是不可能的,因为它是许多遗留代码。并且递归深度限制没有用,因为内存的使用是不确定的。
有没有办法检测可用的堆栈数量,以便我可以优雅地取消操作?
是否有可能实现一种我可以连续检查的Stack Canary不被覆盖?
答案 0 :(得分:0)
如果不关心线程安全性,请使用静态变量。像这样:
int recurse(int something) {
static int depth = 0;
++depth;
if (depth > MAX_DEPTH) { // bail }
...
int result = recurse(...);
--depth;
return result;
}
如果担心线程安全问题,可以将depth
作为参数传递。