Вектор вне диапазона, после выхода игрока из системы - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть серьезная проблема, которую я пытался обойти в течение многих дней, но я не могу найти достаточно хорошее решение, чтобы ее исправить.

Проблема в моем клиенте / соединение с сервером (в частности, в коде игрового сервера), где, когда я выхожу из игры и в сети более 1 игрока, все игроки с более высоким индексом вектора, чем у вышедшего из строя игрока, теперь становятся недействительными, что приводит к сбою сервера из-за того, что вектор игрока находится за пределами диапазона.

Я попытался сократить код, чтобы вам было проще читать только наиболее подходящий код. Я не могу включить весь сетевой код, так как он был бы слишком беспорядочным

main. cpp

#include <iostream>
#include <vector>

int main() {
        Player* newplayer = new Player(username, world);
        //Push two players into the vector, size is 1 after 0, 1
        world->players.push_back(newplayer);
        world->players.push_back(newplayer);

        //Log out player at index 0, then log player at index 1 out.
        for (int i = 0; i < world->characters.size(); i++) {
            world->Logout(world->players[0]);
            world->Logout(world->players[1]);
        }
    }
}

World.h / world. cpp

//in world.h
std::vector<Player*> players;

//in world.cpp
void World::Logout(Player* player)
{
    world->Logout(world->players[0]);this->Logout(player->character);

    this->players.erase(
        std::remove(UTIL_RANGE(this->players), player),
        this->players.end()
    );
}

Я не знаю, правильно ли я объяснил себя, поэтому, если у вас есть какие-либо отзывы о том, как я могу переформулировать свой вопрос или указать более подробную информацию, сообщите мне.

Может, мне вообще не использовать вектор? В этом случае, что мне нужно использовать? Моя программа основана на том, что игроки по-прежнему имеют одинаковый «идентификатор игрока» на протяжении всей программы. Если игрок удален, это становится свободным элементом.

Например, если в векторе 10 игроков. {игрок, игрок, игрок, игрок, игрок, игрок, игрок, игрок, игрок, игрок, игрок} и игрок с индексом 0 выходит из системы, это должно выглядеть так {ноль / бесплатно, игрок, игрок, игрок, игрок, игрок, игрок , игрок, игрок, игрок}

1 Ответ

0 голосов
/ 27 февраля 2020

Ваш код имеет проблему. документы говорят, что std::remove удалит элемент и вернет итератор. Затем вы стираете итератор с std::vector::erase. Однако итератор, возвращаемый из std::remove, является устаревшим, что приводит к ошибке вектора за пределами допустимого диапазона.

...