Bater durante a missão em modo de tempo real
listagem gdb
`Linha 1" principal "de sinal recebido SIGSEGV, Falha de segmentação.
OpenApoc :: BattleHazard :: update (this = 0x60000000d, state = ..., ticks = 1)
em /home/atrosha/OpenApoc/game/state/battle/battlehazard.cpp:490
490 if (ticksUntilVisible> 0)
pilha de informações (gdb)
at /home/atrosha/OpenApoc/game/state/battle/battlehazard.cpp:490
state=..., ticks=1)
at /home/atrosha/OpenApoc/game/state/battle/battle.cpp:1675
at /home/atrosha/OpenApoc/game/state/gamestate.cpp:959
at /home/atrosha/OpenApoc/game/ui/tileview/battleview.cpp:1443
initialStage=...) at /home/atrosha/OpenApoc/framework/framework.cpp:584
at /home/atrosha/OpenApoc/game/main.cpp:26`
Hmm, parece que BattleHazard :: update () está sendo chamado em um objeto lixo -0x60000000d não parece lógico para um ponteiro de heap ....
Acho que isso é causado por um iterador invalidado: BattleHazard::update
pode acabar chamando BattleHazard::expand
, que por sua vez pode chamar die()
em um BattleHazard próximo. Se o perigo destruído for o próximo na iteração, o iterador usado em Battle::update
torna-se inválido (consulte https://en.cppreference.com/w/cpp/container/set/erase)
Esta é a única explicação que consigo pensar
Além disso, terminei essa missão no modo de tempo real sem nenhum erro posterior.
Tão estranho.
Resposta agradável e rápida. Posso mencioná-lo no meu próximo vídeo?
Comentários muito úteis
536 pode corrigir isso, mas será difícil de testar, pois esse bug ocorre uma vez em uma lua azul. Devemos encerrar esse problema assim que mesclar a solicitação pull e reabrir se o bug persistir.