Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++迭代器操作不检查溢出吗?_C++ - Fatal编程技术网

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不同。你为什么会期望呢!=返回真值?