Источник переполнения был указан в других ответах, и другие ответы указали на проблемы архитектурного дизайна в эскизе вашей программы.
Я подумал, что вкратце скажу, как отлаживать такие проблемы самостоятельно.
Во-первых: при переполнении стека практически всегда существует неограниченная рекурсия. Что произошло при переполнении в элементе, который явно не имеет переполнения стека? Это случилось:
void Bad()
{
Good();
Bad();
}
Если вызывается Bad
, то он будет переполняться стеком, но большую часть времени будет сообщаться о переполнении в Good
, поскольку Good
, вероятно, использует больше стека чем любой отдельный звонок на Bad
.
Что вам нужно сделать, это посмотреть на стек вызовов , потому что это будет Good / Bad / Bad / Bad / Bad ...
, и это говорит вам, что Bad
выполняет неограниченную рекурсию. Ключом к поиску источника рекурсии является нахождение того, что на самом деле вызывает себя, прямо или косвенно . Используйте инструменты, имеющиеся в вашем распоряжении, чтобы сделать это; исключение содержит трассировку стека вызовов.