В настоящее время я пытаюсь решить проблему, при которой доступ к первому элементу вектора приводит к сбою моего приложения.
Это всего лишь демонстрационное воссоздание кода, а не сам код.
class Group
{
public:
Player* get_first_player();
private:
std::vector<Player*> players;
}
А это реализация класса:
Player* Group::get_first_player()
{
if (players.size() > 0)
return players[0];
else
return nullptr;
}
А это вызывающая демонстрация:
Player* p = myGroup->get_first_player();
if (p != nullptr)
...
Теперь актуальная проблема: программа вылетает на строке «вернуть игроков [0]». Но он не всегда вылетает при выполнении этой строки, только после того, как мое приложение работало весь день (иногда оно вылетает через 4 часа, иногда через 10 часов). Я мог вообразить две вещи: либо вектор каким-то образом поврежден, либо объект группы, для которого я выполняю вызов, недействителен. Но если это последнее, почему не удается выполнить player.size (), прежде чем он сможет добраться до возвращаемых player [0]?
Если кому-то это интересно, вот реальный код, сгенерированный компилятором и дизассемблированный с помощью IDA:
v7 = *(_DWORD *)myGroup;
if ( (*(_DWORD *)(myGroup + 4) - *(_DWORD *)myGroup) >> 2 )
ret = *(_DWORD *)v7;
else
ret = 0;
«Это невозможно диагностировать, не видя всей картины. Причиной может быть повреждение памяти». фиксированный. Бьюсь об заклад, myGroup недействителен, * улетай *
Но если myGroup недействителен, почему вызов .size () завершается успешно? Ака. если смотреть на дизассемблированный код, почему myGroup+4 может быть разыменован без проблем, а **myGroup не работает?
поскольку неопределенное поведение - это неопределенное поведение, дайте минимальный воспроизводимый пример!
Действительно, похоже, что в какой-то момент вектор становится недействительным, но недостаточно информации, чтобы объяснить, почему. Не могли бы вы отлаживать GDB или что-то в этом роде?
@ jjimenezg93 Это серверное программное обеспечение, и ошибка, кажется, появляется случайным образом. Я не могу отладить его, потому что не знаю, когда ошибка повторится (или что-то еще, что делает вектор поврежденным). Но я почти на 100% уверен, что сам объект группы существует и действителен.
Пожалуйста, опубликуйте весь код, необходимый для возникновения ошибки, в качестве полного примера.





Это практически невозможно диагностировать, не видя всей картины. Причиной может быть повреждение памяти.