繁体   English   中英

为什么程序在迭代 c++ 中的 emtpy 向量时抛出运行时错误

[英]Why program throws runtime error while iterating over an emtpy vector in c++

vector <int> o;    //Empty vector
for(int i=0;i<=o.size()-1;i++) cout<<o[i]; 

在上面得到运行时错误

vector <int> o;  
for(auto j : o){
 cout<<j<<" ";
            } 

但是,如果使用迭代器,则此代码运行良好

C++ 标准要求o.size()返回unsigned类型。 当它为零时,减 1 产生std::numeric_limits<decltype(o.size())>::max()这意味着您的循环运行超过空向量的边界。

for(std::size_t i = 0; i < o.size(); ++i)是显而易见的解决方法。 <=-1的使用在我看来几乎是不诚实的。

o.size()将返回一个无符号值 0。从它减去 1 返回一个非常大的正数,本质上是一个无限循环。 最终,您对o[i]的越界数组访问将导致崩溃。

你可以用

for(int i = 0; i <= int(o.size() - 1); i++)

或者只是使用更典型的

for(int i = 0;i < o.size(); i++)

在那里您检查“小于”,而不是“小于或等于”减去一个数字。

由于sizeof(size_t)大于或等于sizeof(int) (尽管这可能取决于实现)并且size_tunsigned ,因此int ( 1 ) 被转换为size_t

因此,在表达式o.size() - 11被隐式转换为size_t ,并且o.size() - 1 (相当于size_t(0 - 1) )变得等于std::numeric_limits<size_t>::max() 因此,进入for循环并访问索引0处的空o导致未定义的行为。

你应该:

for (size_t idx = 0; idx < o.size(); ++idx) { /* ... */ }

如果出于某种原因您需要索引的类型为int ,您可以:

for (int idx = 0; idx < static_cast<int>(o.size()); ++idx) { /* ... */ }

或在您的示例中(不太常见):

for (int idx = 0; idx <= static_cast<int>(o.size()) - 1; ++idx) { /* ... */ }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM