【问题标题】:Evaluating vector::empty() is crashing the program评估 vector::empty() 正在使程序崩溃
【发布时间】:2012-11-25 16:48:30
【问题描述】:

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

任何时候玩家(客户端)连接到游戏服务器,都会调用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;
}

在我对if 语句评估empty 之前,执行bool empty = player_list-&gt;empty()) 有效。

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

【问题讨论】:

  • 您的代码甚至无法编译。怎么会崩溃? catb.org/esr/faqs/smart-questions.html
  • 为什么有这么多指针?为什么不只是std::vector&lt;Player&gt;
  • 您是否曾经复制过 CPlayerManager 类?如果是这样,您需要正确实施rule of three。或者,我怀疑你是否真的需要一个 std::vector 指针。
  • 不要忘记遵守Player 中的规则。无论如何,你有什么用指针?如果您绝对必须拥有它们,请不要自己进行动态分配。只需使用智能指针。
  • @KerrekSB,这是我第一次听到这个词用来描述代码。

标签: c++ vector crash


【解决方案1】:

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

真的,这段代码应该从轨道上被核爆。您不需要指向向量的指针,也不需要指针向量。这两件事都是自找麻烦。

【讨论】:

  • 感谢您指出正确的方向。对于编写如此糟糕的代码,我深表歉意,但是当我必须检查是否将在特定函数之外访问对象时,我有点恐慌。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多