2010-04-25 70 views
1

我得到一个堆栈溢出上的这第一次迭代的for循环堆栈溢出访问的大载体

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

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

有什么想法?

+0

显示如何填充和定义nList。 – 2010-04-25 13:05:18

+5

376项目是没有办法“大”:)。 – kennytm 2010-04-25 13:06:55

+1

使用nList.size()代替SIZEN作为循环控制条件会不会更好? – 2010-04-25 13:08:14

回答

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

我最初在这里猜测是矢量小于376. []运营商不作为guaratees遍历实际的向量边界。你会非常非常安全,如果您使用的at功能:

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

那里,如果q是它会抛出一个异常向量之外。这将有助于诊断这种类型的运行时问题。

0

如果通过使用例如push_back将376个元素添加到矢量中,那么使用值高于376的访问会导致程序失败,这是正常的,但您确实在访问未初始化的内存和未管理的内存。