记录一则线上bug

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

最近线上出现一次崩溃事故,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::
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值