STL列表在第一个push_back中超出范围

时间:2011-12-05 02:45:59

标签: c++ stl

我在我的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);在我的程序中有效(但在使用列表的另一部分再次出错)。

有人可以给出可能的解释吗?

2 个答案:

答案 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指针之前,从未通过任何操作。