我在win32程序中使用了STL列表,这遇到了一个奇怪的问题。具体地说,在列表第一次执行push_back()
时,我得到了out of range
运行时错误。
下面是列表实例的声明:
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);
在我的程序中工作(但在使用列表的另一部分再次出错)。
谁能给出一个可能的解释?
您的代码中缺少全局变量初始化。如果您真的为此放弃STL,您可能已经将其声明为vector<>
,如果是,则那里还没有"列表",除非您显式地构造它们以具有这样的列表。因为它是由变量索引在你的代码(_i)我假设列表的数组是动态的。如果是这种情况,您首先需要在数组中创建一个列表,并且很可能在那里开始抛出索引0 -range。
typedef std::list<int> IntegerList;
typedef std::vector<IntegerList> ArrayOfIntegerLists;
ArrayOfIntegerLists g_ArrayofLists(10);
如果你的是这样的:
ArrayOfIntegerLists g_ArrayofLists;
这里还没有实际的列表。也许可以添加一个,或者也许可以检查.size()
与您的索引,以确保您没有"走远",可以这么说。
多亏@AlfP的提示,这个问题终于被我解决了。
全局变量非常糟糕。有些类初始化失败,但从来没有告诉我任何东西,直到我在另一个init函数中使用指向new
的指针。