Таким образом, можно очистить любые открытые соединения, и т.д. инициализированные в блоке попытки. Если бы Вы открыли соединение, и затем исключение произошло, то исключение не было бы правильно закрыто. Этот тип сценария - то, для чего наконец блок.
В Visual Studio размер стека по умолчанию, я думаю, составляет 1 МБ, поэтому при глубине рекурсии 10 000 каждый кадр стека может быть не более ~ 100 байт, что должно быть достаточно для алгоритма DFS.
Большинство компиляторов, включая Visual Studio, позволяют указать размер стека. В некоторых (всех?) Версиях Linux размер стека не является частью исполняемого файла, а является переменной среды в ОС. Затем вы можете проверить размер стека с помощью ulimit -s
и установить новое значение с помощью, например, ulimit -s 16384
.
Вот ссылка с размерами стека по умолчанию для gcc.
DFS без рекурсии:
std::stack<Node> dfs;
dfs.push(start);
do {
Node top = dfs.top();
if (top is what we are looking for) {
break;
}
dfs.pop();
for (outgoing nodes from top) {
dfs.push(outgoing node);
}
} while (!dfs.empty())
стеки для потоков часто меньше. Вы можете изменить значение по умолчанию во время ссылки, или также изменить во время выполнения. Для справки, некоторые значения по умолчанию:
Первая ошибка связана с тем, что Length
является свойством класса String
, тогда как в вашей универсальной версии это тип параметра T не известно. Это может быть любой тип.
Вторая ошибка связана с тем, что вы возвращаете только объект запроса, но не фактический результат.
Да, есть вероятность переполнения стека. Стандарт C и C ++ не требует таких вещей, как глубина стека, это, как правило, проблема окружающей среды.
Большинство достойных сред разработки и / или операционных систем позволят вам настроить размер стека процесса, либо во время ссылки, либо во время загрузки.
Вы должны указать, какую ОС и среду разработки вы используете для более адресной помощи.
Например, в Ubuntu Karmic Koala по умолчанию для gcc зарезервировано 2M, а 4K зафиксировано, но это можно изменить, если вы свяжете программа. Для этого используйте параметр - stack
в ld
.
Я не понимаю, что вы имеете в виду, делая поиск в глубину прямоугольного массива, но я предполагаю, что вы знаете, что делаете.
Если ограничение стека является проблемой, вы сможете преобразовать свое рекурсивное решение в итеративное решение, которое помещает промежуточные значения в стек, который выделяется из кучи.