我正在编写另一个程序的扩展程序(特别是游戏)并且我已经坚持解决以下几个小时的问题。
每当玩家(客户端)连接到游戏服务器时,都会调用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
实例尚未初始化和存储NO客户端时,可能会调用此函数,因此我们可能有一个空向量。
每当向量为空时调用GetPlayerInstance
函数,整个游戏服务器都会崩溃。我已经调试了一下,我注意到程序崩溃了:
//Code reaches here
if(player_list->empty())
{
//code does not reach here
return NULL;
}
在bool empty = player_list->empty())
语句中评估empty
之前,if
有效。
什么可能导致这种奇怪的崩溃?
答案 0 :(得分:1)
您的CPlayerManager
类没有复制赋值运算符或复制构造函数。因此,如果您复制它,删除一个实例将删除另一个实例的向量,从而导致灾难。 (关注rule of three。)
真的,这段代码应该从轨道上进行。您不需要指向矢量的指针也不需要指针矢量。这两件事都只是在惹麻烦。