-1

私は現在、別のプログラム (具体的にはゲーム) の拡張機能を作成しており、次の問題の解決に何時間も費やしています。

プレーヤー (クライアント) がゲーム サーバーに接続するたびに、この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())評価するまでは機能emptyifます。

この奇妙なクラッシュの原因は何ですか?

4

1 に答える 1

1

CPlayerManagerクラスにコピー代入演算子またはコピー コンストラクターがありません。したがって、コピーした場合、1 つのインスタンスを削除すると、他のインスタンスのベクトルが削除され、災害につながります。( 3のルールに従ってください。)

本当に、このコードは軌道から核攻撃されるべきです。ベクトルへのポインターも、ポインターのベクトルも必要ありません。これらは両方とも、トラブルを求めているだけです。

于 2012-11-25T16:58:41.923 に答える