私は現在、別のプログラム (具体的にはゲーム) の拡張機能を作成しており、次の問題の解決に何時間も費やしています。
プレーヤー (クライアント) がゲーム サーバーに接続するたびに、この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
ます。
この奇妙なクラッシュの原因は何ですか?