Я использовал список 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);
работы в моей программе (но снова допустил ошибку в другой части, которая использовала список).
Может ли кто-нибудь дать возможное объяснение?