堆栈溢出访问大矢量

时间:2010-04-25 13:01:49

标签: c++ stack-overflow

我在for循环的第一次迭代中得到了堆栈溢出

for (int q = 0; q < SIZEN; q++)
{
    cout<<nList[q]<<" ";
}

nList是int类型的向量,包含376个项目。 nList的大小取决于程序中定义的常量。该程序适用于高达376的每个值,然后在376之后它停止工作。

有什么想法吗?

3 个答案:

答案 0 :(得分:6)

如果“停止工作”,你的意思是崩溃,那么你可能正在读取超过缓冲区的末尾。 vector::operator[]未经过范围检查,所以它会让你自己射击。

如果要遍历矢量,请使用迭代器,或至少nList.size()

所以对代码的修改最少:

for (int q = 0; q < nList.size(); q++)
{
    cout << nList[q] << " ";
}

或使用迭代器

for (std::vector<int>::const_iterator it = nList.begin();
     it != nList.end(); ++it) {
  cout << *it << " ";
}

答案 1 :(得分:1)

我在这里的初步猜测是向量小于376. []运算符没有保证运行实际的向量边界。如果使用at函数,那么你会更安全,更安全:

for(int i=0; i < nList.size(); ++i){
  cout << nList.at(q) << " ";
}

那里,如果q在向量之外,它将抛出异常。这将有助于诊断此类运行时问题。

答案 2 :(得分:0)

如果您通过使用例如push_back向向量添加了376个元素,则通常情况下,值大于376的访问会导致程序失败,您正在访问肯定未初始化且未受管理的内存。