c ++ std :: vector.insert在调试时崩溃,但在发布时有效

时间:2011-12-01 04:13:46

标签: c++ visual-studio-2010 vector iterator

我的程序在此行崩溃,但仅在调试版本中,它在发布版本中运行良好。

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;
}

2 个答案:

答案 0 :(得分:4)

当你的结构不是POD 时,

memset(this, 0, sizeof(SimpleList));是不安全的。

由于成员std::vector<int>m_lstItem;,您的结构不是POD。

因此,在这种情况下,使用memset 不安全会导致未定义的行为。换句话说:任何事都可以发生!并且任何包括按预期工作......

我的建议:除非你完全知道自己在做什么,否则不要在C ++中使用memset

答案 1 :(得分:0)

我想当程序运行时,索引Insert不为0。 当向量在DEBUG模式下超出范围时,向量将抛出异常,而在RELEASE模式下则不会。 所以请告诉你完整的代码。