【发布时间】:2011-12-01 04:13:45
【问题描述】:
我的程序在这一行崩溃,但仅在调试版本中,它在发布版本中运行良好。
m_lstIds.insert(m_lstIds.begin() + indexInsert, ID);
'm_lstIds' 是 int 的 std::vector,'ID' 是 int。当程序崩溃时,m_lstIds 有 3 个项目(1、2、3)。 indexInsert 为“0”,ID 为“0”。
错误信息说:
Expression: vector iterator + offset out of range
我正在运行 Visual Studio 2010;我猜这与与 STL 优化冲突的不良项目设置有关。
编辑:
当我说:“适用于发布”时,我的意思是如果我为 i = 0..3 执行std::cout<<m_lstIds[i],我实际上会打印出 0,1,2,3。在调试版本中,当我尝试插入时它会崩溃。
编辑2: 我找到了答案!感谢大家的帮助。
这是最短的复制品。问题是我在构造函数中调用的memset 函数。因为m_lstItem 的构造函数是在memset 之前调用的,所以它将擦除向量中允许insert 正常工作的所有数据。
真正有趣的是它在发布中是如何工作的,而不是在调试中。如果有人能解释那部分,那就太好了。
struct SimpleList
{
SimpleList()
{
memset(this, 0, sizeof(SimpleList));
m_lstItem.push_back(0);
m_lstItem.push_back(1);
m_lstItem.push_back(2);
}
void Crash()
{
m_lstItem.insert(m_lstItem.begin() + 0, 3);
}
std::vector<int>m_lstItem;
};
int main(int argc, char** argv[])
{
SimpleList sl;
sl.Crash();
return 0;
}
【问题讨论】:
-
您确定容器包含三个元素并且索引为 0 吗?它在发布中“工作”的事实意味着代码实际上已损坏,但如果没有运行时检查,您不会收到任何错误。
-
向我们展示您的代码的工作示例,我们很难弄清楚向量是如何修改、使用等的。
-
我无法重现该问题。需要查看完整代码。
-
我相信您没有初始化在发布版本中设置为 0 和在调试版本中设置为 0xcdcdcdcd 的变量或其他一些垃圾,最终引用无效索引。如果您没有正确初始化“i”变量(使用 0),这将是可能的。啊,不,对不起,你在插入时说..你也可以检查一下:)
-
memset(this, 0, sizeof(SimpleList));除非您的班级是 POD,否则不要这样做!std::vector必须使用自己的构造函数进行初始化。
标签: c++ visual-studio-2010 vector iterator