评估vector :: empty()会导致程序崩溃

时间:2012-11-25 16:48:30

标签: c++ vector crash

我正在编写另一个程序的扩展程序(特别是游戏)并且我已经坚持解决以下几个小时的问题。

每当玩家(客户端)连接到游戏服务器时,都会调用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有效。

什么可能导致这种奇怪的崩溃?

1 个答案:

答案 0 :(得分:1)

您的CPlayerManager类没有复制赋值运算符或复制构造函数。因此,如果您复制它,删除一个实例将删除另一个实例的向量,从而导致灾难。 (关注rule of three。)

真的,这段代码应该从轨道上进行。您不需要指向矢量的指针也不需要指针矢量。这两件事都只是在惹麻烦。