Есть ли способ определить, в какой момент я столкнусь с переполнением стека?
Не совсем. Переполнение стека происходит, когда вы исчерпываете пространство стека - однако ...
- Исходный размер стека может быть изменен программно и может по умолчанию принимать разные значения в зависимости от вашей ОС / компилятора / etc
- Сколько из этого уже использовано, зависит от того, что ваше приложение (и библиотеки, которые использует ваше приложение) ранее делали - это часто невозможно предсказать
- Сколько стека требует каждый вызов, зависит от того, что вы делаете в своей функции. Если вы выделяете, скажем, 1 целое число в стеке, вы можете использовать огромное количество раз, но если вы выделяете буфер 200 КБ в стеке, не так много.
Единственный раз, когда я ударил по одному, это бесконечный цикл или использование вышеупомянутого буфера 200 КБ.
Я считаю, что для моего приложения гораздо предпочтительнее просто аварийно завершить работу приложения, чем бесконечно зацикливать его, используя 100% ЦП, и его нужно принудительно уничтожать (это правильная PITA на удаленном сервере через плохое соединение, поскольку в Windows отсутствует SSH )
Грубый ориентир: как вы думаете, ваша рекурсивная функция может вызывать себя больше, чем, скажем, 10000 раз подряд? Или вы делаете что-то глупое, например, выделяете 200К буферов в стеке?
Если да, беспокойтесь об этом.
Если нет, продолжайте с более важными вещами.