我目前正在编写另一个程序(特别是游戏)的扩展,并且我已经坚持了几个小时来解决以下问题。
每当玩家(客户端)连接到游戏服务器时,OnClientConnected(int client_number);
都会调用该函数。在这个函数中,我创建了一个CPlayer
存储玩家信息的类的实例,例如健康、速度和我可能需要的任何其他数据。然后,此实例由以下类存储:
class CPlayerManager
{
std::vector<Player*> *player_list;
public:
CPlayerManager();
~CPlayerManager();
void AddPlayer(client_id)
*CPlayer GetPlayerInstance(client_id);
}
CPlayerManager()
{
player_list = new std::vector<Player*>;
}
~CPlayerManager()
{
delete player_list;
}
void CPlayerManager::AddPlayer(client_id)
{
CPlayer *player = new CPlayer(client_id);
player_list->push_back(player);
}
void *CPlayerManager::GetPlayerInstance(client_id)
{
if(player_list->empty())
{
return NULL;
}
for(std::vector<CPlayer*>::size_type i = 0; i != player_list->size(); i++)
{
int client = player_list->at(i)->GetClientId();
if(client_id == client)
{
return player_list->at(i);
}
}
return NULL;
}
原始游戏函数使用客户端索引作为参数和返回值,所以我需要一直从客户端索引中获取玩家实例。问题出在GetPlayerInstance
功能上。当实例尚未初始化和存储任何客户端时,可能会调用此函数CPlayerManager
,因此我们可能有一个空向量。每当向量为空时调用该GetPlayerInstance
函数,整个游戏服务器都会崩溃。我已经调试了一下,我注意到程序崩溃了:
//Code reaches here
if(player_list->empty())
{
//code does not reach here
return NULL;
}
在我对声明bool empty = player_list->empty())
进行评估之前,一直在做。empty
if
什么可能导致这种奇怪的崩溃?