Список STL вне диапазона в первом push_back - PullRequest
1 голос
/ 05 декабря 2011

Я использовал список STL в моей программе win32, что натолкнулось на странную проблему. Если быть точным, я получил ошибку out of range во время выполнения в первый раз, когда список push_back().

Вот объявление этого экземпляра списка:

AtomActionList g_AtomActions[MAXPLAYER];

Это глобальная переменная, находящаяся в том же файле с записью _tWinMain().

Вот соответствующие определения (они разделены на 3 разных заголовочных файла):

#define MAXPLAYER 2

typedef int AtomAction_id;

typedef std::list<AtomAction_id> AtomActionList;

А вот части, которые когда-либо используют g_AtomActions в основном файле:

...

g_AtomActions[_i].push_back(aaid);

...

if (!g_AtomActions[_i].empty()){
    shareData.newAtomAction[_i] = g_AtomActions[_i].front();
    g_AtomActions[_i].pop_front();
}

Раньше в функции init использовался метод clear, но я прокомментировал его, когда увидел ошибку времени выполнения вне допустимого диапазона в части g_AtomActions[_i].push_back(aaid);. Однако ошибка остается после этого.

Я установил несколько точек останова, запустил их в режиме отладки и посмотрел. Я совершенно уверен, что ошибка происходит в первый раз g_AtomActions[_i].push_back(aaid); выполняется. _i равно 0 и aaid равно 2, размер g_AtomActions[_i] равно 0. Ни один другой компонент еще не использовал этот идентификатор.

Я не смог понять, почему. Поэтому я попытался изменить его на deque, надеялся получить удачу и неожиданно обнаружил g_AtomActions[_i].push_back(aaid); работы в моей программе (но снова допустил ошибку в другой части, которая использовала список).

Может ли кто-нибудь дать возможное объяснение?

Ответы [ 2 ]

1 голос
/ 16 июля 2012

В вашем коде отсутствует инициализация глобальной переменной.Если вы действительно откусываете за это STL, возможно, вы объявили его vector<>, и если это так, то там пока нет «списков», если только вы явно не сконструировали их, чтобы иметь такие.Поскольку он индексируется переменной в вашем коде (_i), я предполагаю, что массив списков является динамическим.Если это так, сначала вам нужен список в вашем массиве, и вполне вероятно, что индекс oo-range начинает создаваться.

typedef std::list<int> IntegerList;
typedef std::vector<IntegerList> ArrayOfIntegerLists;
ArrayOfIntegerLists g_ArrayofLists(10);

Если ваш выглядит так:

ArrayOfIntegerLists g_ArrayofLists;

У вас пока нет актуальных списков.Возможно, добавьте один или, возможно, сверяйте .size() со своим индексом, чтобы убедиться, что вы не «уходите в глубокий конец», так сказать.

0 голосов
/ 19 сентября 2012

Благодаря подсказкам @AlfP, эта проблема наконец-то решена мной.

Глобальные переменные очень плохие.Некоторые классы не смогли инициализироваться, но никогда ничего не говорили мне, пока я не использую указатели для new их в другой функции инициализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...