У меня есть сильно рекурсивная функция, которая создает (очень маленькое) std::multimap
локально для каждого экземпляра функции, используя new
(который возвращается к malloc/calloc
в std lib). После нескольких сотен рекурсий новый сбой, хотя я использую родное 64-битное приложение на Windows XP x64. Машина имеет 10 ГБ оперативной памяти, приложение использует только около 1 ГБ. Другие большие приложения не работают.
Это происходит через несколько минут после запуска программы и запуска рекурсивной функции. В этот момент рекурсивная функция была вызвана около 150.000 раз, возможно, с максимальным значением. рекурсия нескольких сотен. Проблема не в переполнении стека.
Я использую Visual Studio 2005 и программное обеспечение STL. Ошибка возникает в сборке выпуска.
EDIT:
Хорошо, вот код
Теперь я переставил код и поместил карту в стек, но для инициализации он использует новое - там это не получается. Я также попытался использовать std :: multimap вместо hash_multimap. Все это умирает, не меняет своего поведения.
int TraceBackSource(CalcParams *CalcData, CKnoObj *theKno, int qualNo,
double maschFak, double partAmount, int MaschLevel, char *MaschID,
double *totalStrFlow, int passNo,
CTraceBackData *ResultData)
{ typedef std::hash_multimap<double, CStrObj *>StrFMap;
StrFMap thePipes;
for(...)
{
...
thePipes.insert(std::make_pair(thisFlow, theStr));
}
// max. 5 elements in "thePipes"
for(StrFMap::iterator it = thePipes.begin(); it != thePipes.end(); it++)
{
...
try
{
TraceBackSource(CalcData, otherKno, qualNo, maschFak * nodeFak, nodeAmount, SubMaschlevel, newMaschID, totalStrFlow, passNo, ResultData);
}
catch(std::exception &it)
{
Trace(0, "*** Exception, %s", it.what());
return 0;
}
return 0;
}
}
Интересно, что первый сбой встречается с обработчиком перехвата, чуть позже я заканчиваю НАРУШЕНИЕ ДОСТУПА и поврежденный стек.