我在我的win32程序中使用了STL列表,这遇到了一个奇怪的问题。具体来说,我在列表第一次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函数中曾经有一个明确的方法,但是当我在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);
在我的程序中有效(但在使用列表的另一部分再次出错)。
有人可以给出可能的解释吗?
答案 0 :(得分:1)
您的代码中缺少全局变量初始化。如果你真的因为STL咬了这个,你可能已经宣布它是vector<>
,如果是,那里除了你明确构造它们之外还没有“列表”。因为它是由你的代码(_i)中的变量索引,所以我假设列表数组是动态的。如果是这种情况,首先需要在数组中使用一个列表,并且可能会出现索引oo-range开始抛出。
typedef std::list<int> IntegerList;
typedef std::vector<IntegerList> ArrayOfIntegerLists;
ArrayOfIntegerLists g_ArrayofLists(10);
如果你的看起来像这样:
ArrayOfIntegerLists g_ArrayofLists;
你还没有实际的名单。也许可以添加一个,或者对你的索引检查.size()
,以确保你不会“脱离深层”可以这么说。
答案 1 :(得分:0)
感谢来自@AlfP的提示,我终于解决了这个问题。
全局变量非常糟糕。有些类无法初始化,但在我使用另一个init函数中的new
指针之前,从未通过任何操作。