Я видел подобную проблему в своем собственном коде. Я не думаю, что авария имеет какое-то отношение к тому, что у вас есть карта внутри карты. Я думаю, что проблема скорее связана с тем фактом, что вы удаляете элемент карты во время итерации по одной и той же карте.
Я решил эту проблему в своем собственном коде следующим образом: я перебираю по карте, и если я стираю любые элементы карты, я подниму логический флаг и сломаю свой цикл итерации. После цикла, если этот флаг поднят, я перезапущу итерацию и повторяю, пока не будет необходимости в стирании. Вот мой код:
void serve::reclaim_server_resources()
{
dPrintf("()");
bool erased = false;
for (std::map<int, serve_client>::iterator iter = client_map.begin();
iter != client_map.end(); ++iter) {
if (!iter->second.check()) {
dPrintf("erasing idle client...");
client_map.erase(iter->first);
/* stop the loop if we erased any targets */
erased = true;
break;
}
}
/* if we erased a target, restart the above by re-calling this function recursively */
if (erased)
reclaim_server_resources();
}
Если удалить break;
из моего цикла, код аварии, вероятно, таким же образом, что ваши делают.
Это действительно просто предложение об обходном пути к вашей проблеме. Возможно, могут быть лучшие доступные решения, но должно быть полезно, по крайней мере, знать, как подобные проблемы могут проявляться в других подобных ситуациях.
Если вы хотите попробовать свое обходное решение самостоятельно, вам может потребоваться разбить вашу функцию на две более мелкие функции, так что, когда вы перезапустите итерацию путем рекурсивного вызова новой функции, она может перезапустить итерацию внутренней карты, что перезапуск всей внешней карты.
Вы говорите: «НЕ РАБОТАЕТ ПОЧЕМУ?» ... но что он делает? Он ничего не делает? Это крушение? – mkrufky
Да, программа, с которой она столкнулась – user3671361
Ну, может быть, вы могли бы попробовать ее отладить? – developerbmw