我的程序在此行崩溃,但仅在调试版本中,它在发布版本中运行良好。
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。在调试版本中,当我尝试插入时它只会崩溃。
EDIT2: 我找到了答案!谢谢大家的帮助。
这是最短的复制品。问题是我在构造函数中调用的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 :(得分:4)
memset(this, 0, sizeof(SimpleList));
是不安全的。
由于成员std::vector<int>m_lstItem;
,您的结构不是POD。
因此,在这种情况下,使用memset
不安全会导致未定义的行为。换句话说:任何事都可以发生!并且任何包括按预期工作......
我的建议:除非你完全知道自己在做什么,否则不要在C ++中使用memset
。
答案 1 :(得分:0)
我想当程序运行时,索引Insert不为0。 当向量在DEBUG模式下超出范围时,向量将抛出异常,而在RELEASE模式下则不会。 所以请告诉你完整的代码。