最近线上出现一次崩溃事故,core在了dynamic_cast类型转化上面,之前一直跑的好好的,第一反应是存在野指针了。
void RoomHandler::KickAllPlayersInRoom(Room* room)
{
vector<IPlayer*> players = room->GetPlayers();
for (size_t i=0; i<players.size(); i++) {
ProcessPlayerQuit(dynamic_cast<Player*>(players[i]), room);
}
}
经过仔细排查并没有发现释放完后,没有在容器中删除的情况。
其中的GetPlayers大概是这种结构:
std::vector<IPlayer*> Room::GetPlayers()
{
std::vector<IPlayer*>

线上发生一起崩溃事故,问题出在`dynamic_cast`类型转化上。经过排查,排除了野指针的可能性。问题出现在`GetPlayers`函数,该函数将map数据复制到vector中。通过特定工具打印STL内容发现map为空,但游戏逻辑是单线程,进一步调查发现问题源于`ProcessPlayerQuit`函数,该函数在深调用层级中清理了room的player信息,并可能导致了第二次调用`KickAllPlayersInRoom`时,尝试动态类型转化已删除的元素,从而引发崩溃。
最低0.47元/天 解锁文章
209

被折叠的 条评论
为什么被折叠?



