gpt4 book ai didi

c++ - 评估 vector::empty() 会使程序崩溃

转载 作者:行者123 更新时间:2023-12-02 10:32:45 25 4
gpt4 key购买 nike

我目前正在编写另一个程序(具体来说是游戏)的扩展,并且我已经花费了几个小时来解决以下问题。

每当玩家(客户端)连接到游戏服务器时,都会调用 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 实例尚未初始化和存储任何客户端时,可能会调用此函数,因此我们可能有一个空 vector 。当 vector 为空时,只要调用 GetPlayerInstance 函数,整个游戏服务器就会崩溃。我已经调试了一下,我注意到程序崩溃了:

//Code reaches here
if(player_list->empty())
{
//code does not reach here
return NULL;
}

在我对 if 语句计算 empty 之前,执行 boolempty =player_list->empty()) 会起作用。

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

最佳答案

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

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

关于c++ - 评估 vector::empty() 会使程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13553144/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com