0

だから私は自分のアプリケーションをデバッグしました、そしてこれはデバッガーが私に言ったことです:

ここに画像の説明を入力

行で:

            if(p_IS_TRUE(playerid,CHECK_INACTIVITY))

次のように定義されています。

#define p_IS_TRUE(playerid,check)      (p_CheckForStuff[playerid] & check)

したがって、これは重要なコードです。

//global
#define CHECK_SPAWNKILL         (128)   // 0000 0000 0000 0000 0000 0000 1000 0000
#define CHECK_INACTIVITY        (256)   // 0000 0000 0000 0000 0000 0001 0000 0000
#define CHECK_TELEPORT          (512)   // 0000 0000 0000 0000 0000 0010 0000 0000
#define CHECK_AIRBREAK          (1024)  // 0000 0000 0000 0000 0000 0100 0000 0000

unsigned long p_CheckForStuff[MAX_PLAYERS];
#define p_IS_TRUE(playerid,check)      (p_CheckForStuff[playerid] & check)
list<int> PlayerLoopList;

//When a player connects
    PlayerLoopList.push_back(playerid);
    p_CheckForStuff[playerid] =-1;//enable all checks

//When a player disconnects
    PlayerLoopList.remove(playerid);

//ProcessTick
    int playerid = 0;
    int ProcessTicksize = 0;
    int ProcessTickindex = 0;
    for (list <int>::iterator i = PlayerLoopList.begin(); i != PlayerLoopList.end(); ++i)
    {
        playerid = *i;
        int playerstate = GetPlayerState(playerid);
        int vid = GetPlayerVehicleID(playerid);
        if(g_IS_TRUE(CHECK_INACTIVITY))
        {
            if(p_IS_TRUE(playerid,CHECK_INACTIVITY))
            {
                if(p_AcivityInfo[playerid].Reported == false)
                {

次のように再現できます。

1) サーバーに参加する 2) 終了/キックされる? 3) 再参加 4) クラッシュ

なぜこれが起こっているのか誰にも分かりますか?コードは私には完璧に見えます..

4

1 に答える 1

2

アクセス違反は通常、nullポインターまたは初期化されていないポインターを読み取ろうとしたり、配列の末尾を読み取ろうとしたりすることで発生します。

この場合、配列値を読み取っているので、値が配列の境界playerid以上である可能性があります。MAX_PLAYERS

于 2012-07-24T09:14:01.657 に答える