Программа вылетает при доступе к первому элементу вектора

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

Это всего лишь демонстрационное воссоздание кода, а не сам код.

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;

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

Jabberwocky 08.04.2018 10:55

«Это невозможно диагностировать, не видя всей картины. Причиной может быть повреждение памяти». фиксированный. Бьюсь об заклад, myGroup недействителен, * улетай *

Stargateur 08.04.2018 10:59

Но если myGroup недействителен, почему вызов .size () завершается успешно? Ака. если смотреть на дизассемблированный код, почему myGroup+4 может быть разыменован без проблем, а **myGroup не работает?

Kai Peterson 08.04.2018 11:03

поскольку неопределенное поведение - это неопределенное поведение, дайте минимальный воспроизводимый пример!

Stargateur 08.04.2018 11:03

Действительно, похоже, что в какой-то момент вектор становится недействительным, но недостаточно информации, чтобы объяснить, почему. Не могли бы вы отлаживать GDB или что-то в этом роде?

jjimenezg93 08.04.2018 11:04

@ jjimenezg93 Это серверное программное обеспечение, и ошибка, кажется, появляется случайным образом. Я не могу отладить его, потому что не знаю, когда ошибка повторится (или что-то еще, что делает вектор поврежденным). Но я почти на 100% уверен, что сам объект группы существует и действителен.

Kai Peterson 08.04.2018 11:27

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

Galik 08.04.2018 11:54
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
56
0

Другие вопросы по теме