Как защитить в IOS от EXC_BAD_ACCESS в рекурсивном алгоритме - PullRequest
4 голосов
/ 03 декабря 2011

Я пытаюсь выполнить некоторые симуляции и математические операции, которые являются высокорекурсивными, и в некоторых крайних случаях я переполняю стек вызовов и получаю сигнал EXC_BAD_ACCESS. Невозможно изменить алгоритмы на итеративную форму, поскольку это много унаследованного кода. И предел глубины рекурсии не будет полезен, потому что использование памяти недетерминировано.

Есть ли способ определить количество доступных стеков, чтобы я мог корректно отменить операцию?

Возможно ли реализовать тип канарейки стека, который я могу постоянно проверять, не переопределяется?

1 Ответ

0 голосов
/ 03 декабря 2011

Если потокобезопасность не имеет значения, используйте статическую переменную. Примерно так:

int recurse(int something) {
  static int depth = 0;
  ++depth;
  if (depth > MAX_DEPTH) { // bail }

  ...
  int result = recurse(...);
  --depth;
  return result;
}

Если безопасность потока является проблемой, вы можете передать depth в качестве параметра.

...