STL列表超出了第一个push_back的范围



我在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的指针。

最新更新