У меня есть сервер, который объединяет 2 игроков по запросу и запускает игру Game
в новой теме.
struct GInfo {Game* game; std::thread* g_thread};
while (true) {
players_pair = matchPlayers();
Game* game = new Game(players_pair);
std::thread* game_T = new std::thread(&Game::start, game);
GInfo ginfo = {game, game_T}
_actives.push_back(ginfo); // std::list
}
Я пишу «Сборщик мусора», который запускается в другом потоке для очистки памяти от прерванных игр.
void garbageCollector() {
while (true) {
for (std::list<Ginfo>::iterator it = _actives.begin(); it != _actives.end(); ++it) {
if (! it->game->isActive()) {
delete it->game; it->game = nullptr;
it->g_thread->join();
delete it->g_thread; it->g_thread = nullptr;
_actives.erase(it);
}
}
sleep(2);
}
}
Это генерирует segfault, я подозреваю, что это из-за того, что _active.erase(it)
находится в цикле итерации.
Для устранения неполадок я сделал _actives
std::vector
(вместо std::list
) и применил тот же алгоритм, но с использованием индексов вместо итераторов, он работает нормально.
Есть ли способ обойти это?
Хорошо ли использован алгоритм, структура данных? Есть ли лучший способ сделать сборку мусора?
Помощь приветствуется!