C++迭代器操作不检查溢出吗?
有一次我写了一句话:C++迭代器操作不检查溢出吗?,c++,C++,有一次我写了一句话: while(++itr!=container.end()) { do something here } 即使在itr通过end后,条件仍然为真。我很困惑。我认为操作符++应该检查边界。但似乎不是。下面是一个测试程序: int main() { vector<int> x; vector<string> y; x.push_back(10); y.push_back("test"); auto itr
while(++itr!=container.end())
{
do something here
}
即使在itr通过end后,条件仍然为真。我很困惑。我认为操作符++应该检查边界。但似乎不是。下面是一个测试程序:
int main()
{
vector<int> x;
vector<string> y;
x.push_back(10);
y.push_back("test");
auto itr = x.end();
assert(itr == x.end());
// this line makes itr past end
++itr;
// this line is true
assert(itr != x.end());
// this line doesn't report any address issue or segment fault
cout << *itr << endl;
auto itry = y.end();
assert(itry == y.end());
++itry;
// no error report
assert(itry != y.end());
// report segment fault
cout << *itry << endl;
return 0;
}
在STD C++中迭代器不检查过去的结束或开始之前是否为-运算符?
这就是它们的工作方式,这是性能原因。迭代器是根据指针建模的,指针不检查增量上的边界但是,如果增量超过末尾,您将得到未定义的行为。这就是它们的工作方式,这是出于性能原因。迭代器是根据指针建模的,指针不检查增量上的边界 但是,如果增量超过末尾,则会得到未定义的行为。是的
while(++itr!=container.end())
{
do something here
}
if itr==end() ,++itr can be anything!
so,you must write :
if(it != xxx.end())
{
while(++it != xxx.end())
{
do sth
}
}
是的
可以这里有鼻魔。威尔很可能是个正确的词,尽管我们有时会在某个特定时刻幸运地记住记忆中的东西。你什么时候不会得到UB?结果可能看起来有效,但仍然有效UB@EricFortin:当这种情况发生时,真是太不幸了。您更希望崩溃,以便修复bug。另一种方法是将你的buggy程序推到生产环境中,只会让它在一段时间内爆炸,然后它就会爆炸。UB并不意味着只有当它不起作用时才是坏的。这总是UB,不管发生什么。@EdS完全同意,我更喜欢崩溃。所以,是的,它最好用不吉利的字眼来形容,这取决于你从哪个角度看它;可以这里有鼻魔。威尔很可能是个正确的词,尽管我们有时会在某个特定时刻幸运地记住记忆中的东西。你什么时候不会得到UB?结果可能看起来有效,但仍然有效UB@EricFortin:当这种情况发生时,真是太不幸了。您更希望崩溃,以便修复bug。另一种方法是将你的buggy程序推到生产环境中,只会让它在一段时间内爆炸,然后它就会爆炸。UB并不意味着只有当它不起作用时才是坏的。这总是UB,不管发生什么。@EdS完全同意,我更喜欢崩溃。所以,是的,它最好用不吉利的字眼来形容,这取决于你从哪个角度看它;C++就是不为你不需要的东西付费。迭代器不执行边界检查,这是您的工作。end+1与end不同。你为什么会期望呢!=C++是完全不为你不需要的东西付费的。迭代器不执行边界检查,这是您的工作。end+1与end不同。你为什么会期望呢!=返回真值?