Vector erase操作 core down

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/changyayun/article/details/78865485

Vector erase操作 core down

复现代码

for(std::vector<int>::iterator iter=uid.begin(); iter!=uid.end(); iter++)
            {
                if( *iter == temp_uid) {
                    iter = uid.erase(iter);
                }
            }

第一个坑

vector的删除操作会有一个坑,就是删除的时候一定要将删除操作的结果赋值给一个新的迭代器。

因为执行erase操作之后,执行操作的iter会变的无效。这时应该使用erase的返回结果,返回结果是被删除元素的下一个位置。

所以操作必须是这样的

iter = uid.erase(iter);

还有坑

然而这样服务启动还是core了,single 11

这是为什么呢
当满足删除要求的是最后一个元素时,问题就出现了。例如上面的例子里,当删除最后一个元素的时候,返回的迭代器就指向了end。

按照for循环的执行逻辑,先判断条件,然后执行,最后执行递增进入下一次循环。

于是对返回的迭代器递增,这时候迭代器已经飞起来了(不知道指向哪里),新一轮循环开始,判断迭代器是否指向end,肯定不满足,接着执行循环体,此时越界了。

改进代码

for(std::vector<int>::iterator iter=uid.begin(); iter!=uid.end(); )
{
    if( *iter == temp_uid) {
        iter = uid.erase(iter);
    }else
        iter++;
}

递增逻辑由自己实现,命中删除操作的时候不进行iter++。这样就没问题了。

猜你喜欢

转载自blog.csdn.net/changyayun/article/details/78865485
今日推荐