Код ниже:
#include <iostream>
#include <algorithm>
#include <locale>
#include <exception>
using namespace std;
double last_pos = 0x00;
int N = 0x00;
void str_cut()
{ ++last_pos; // падает на == 3805
if (last_pos > 64*1024) {
return; // exit condition
}
else {
try {
str_cut(); // Move semantics ONLY!
}
catch (std::exception const& e) {
throw exception{};
cerr << "Stack Overflow detected!" << /*e << */endl;
}
}
}
int main()
{
try {
// UTF-8 settings here
setlocale(LC_ALL, "");
setlocale(LC_ALL, "rus");
std::cout.flush();
str_cut();
system("pause");
return 0;
}
catch (...) {
// stack overflow exception handling
throw exception{};
cerr << "Stack Overflow detected!" << /*e << */endl;
}
}
Программа падает с Stack Overflow.
Упростил все для наглядности, теперь видно что происходит тупо превышение глубины стека (почему именно около 4000 вызовов?)
*Передачу по значению исправил с помощью move-семантики, утечек больше нет!
Но, как я понимаю, рекурсию придется убирать, хотя бы вот так:
while(last_pos < 65535) str_cut();
И сопутствующие вопросы:
1) Достаточно ли того, что я установил в начале программы локаль для работы с utf-8? (обрабатывать русские символы и т.д.)
2) Как в данном случае правильно обработать исключения?
ЗЫ: Буду рад любым советам!