diff --git a/cockatrice/src/client/tabs/tab_game.cpp b/cockatrice/src/client/tabs/tab_game.cpp index b79968a5c..d9f7eb60f 100644 --- a/cockatrice/src/client/tabs/tab_game.cpp +++ b/cockatrice/src/client/tabs/tab_game.cpp @@ -189,14 +189,7 @@ void TabGame::emitUserEvent() TabGame::~TabGame() { - scene->clearViews(); - delete replay; - - QMapIterator i(players); - while (i.hasNext()) { - delete i.next().value(); - } } void TabGame::updatePlayerListDockTitle() diff --git a/cockatrice/src/game/game_scene.cpp b/cockatrice/src/game/game_scene.cpp index af1e40f96..e649bbb2a 100644 --- a/cockatrice/src/game/game_scene.cpp +++ b/cockatrice/src/game/game_scene.cpp @@ -29,6 +29,13 @@ GameScene::GameScene(PhasesToolbar *_phasesToolbar, QObject *parent) GameScene::~GameScene() { delete animationTimer; + + // DO NOT call clearViews() here + // clearViews calls close() on the zoneViews, which sends signals; sending signals in destructors leads to segfaults + // deleteLater() deletes the zoneView without allowing it to send signals + for (const auto &zoneView : zoneViews) { + zoneView->deleteLater(); + } } void GameScene::retranslateUi() @@ -76,7 +83,7 @@ void GameScene::rearrange() QListIterator playersIter(players); while (playersIter.hasNext()) { Player *p = playersIter.next(); - if (!p->getConceded()) { + if (p && !p->getConceded()) { playersPlaying.append(p); if (!firstPlayerFound && (p->getLocal())) { firstPlayerIndex = playersPlaying.size() - 1;