在使用QT迭代器的时候,发现迭代器的终止行为与预期不符,代码如下

int main(int argc, char* argv[]) {

     QList<int> ranges = {2, 3, 4, 5};

    QList<int> temp = ranges;

    auto it1 = temp.cbegin();
    auto it = temp.begin();

    int count = 0;
    while ((it1 + 1) != temp.cend() && count < 20) {
        ++it1;
        ++count;
    }
    qDebug() << "count" << count;

    return 0;
}

运行结果是20,也就是it1+1判断cend()不对,迭代器失效

原因分析:原因在于QList<int> temp = ranges,拷贝ranges到temp上,QT底层是将ranges的地址赋值给temp,此时调用temp.cbegin()获取的是ranges的const 迭代器it1,然后调用temp.begin(),底层会调用(detach->d.detach->reallocateAndGrow),将内存块拷贝到新的地址,将temp指向新地址,此时it1迭代器会失效,和temp.cend()无法再进行判断。

image.png

image.png

image.png

image.png

将temp.begin()代码去掉或者在获取cbegin()之前调用resize(任意行为都可以,只要能触发拷贝)触发拷贝,或者begin()之后重新获取cbegin()迭代器等方式都可以解决这个问题。


点墨
26 声望3 粉丝

全栈前端开发工程师