迭代器失效(2)—一个例子

原创 2013年01月05日 20:01:25

                  前几天刚写了一篇关于STL迭代器失效的博文(迭代器失效(1)-小心使用STL容器的erase() ),今天又犯了错误,原因是代码结构的复杂性掩盖了迭代器失效的事实。

                 现把代码层层简化,如下:

#include <vector>

std::vector<int> myVector;

void do_something();
void handleElement(int val);

int main()
{
    myVector.push_back(1);
    myVector.push_back(2);
    myVector.push_back(3);
    myVector.push_back(4);
    myVector.push_back(5);

    do_something();
    // handleElement(2);

    return 0;
}

void do_something()
{
    std::vector<int>::iterator it = myVector.begin();
    for (;it != myVector.end(); it++)
    {
        handleElement(*it);
    }
}

void handleElement(int val)
{
    std::vector<int>::iterator it = myVector.begin();
    while (it != myVector.end())
    {
        if (val == *it)
        {
            it = myVector.erase(it);
        }
        else
        {
            it++;
        }
    }
}
                这段代码有问题吗?运行时直接segment fault。为什么?

                迭代器失效了吗?没错,但不是在handleElement()里,而在do_something()。do_something()中,遍历容器元素的过程中,handleElement()删除了元素。


转载本文请注明作者和出处[Gary的影响力]http://garyelephant.me,请勿用于任何商业用途!

Author: Gary Gao 关注互联网、分布式、高并发、自动化、软件团队
支持我的工作:  https://me.alipay.com/garygao

版权声明:本文为博主(微博@Gary的影响力)原创文章,未经博主允许不得转载。博客地址:http://garyelephant.me

vector迭代器失效解决方法 及 内存原理

迭代器失效 vector是个连续内存存储的容器,如果vector容器的中间某个元素被删除或从中间插入一个元素, 有可能导致内存空间不够用而重新分配一块大的内存。这个动作将导致先前获取的迭代器,,第一层...
  • AXuan_K
  • AXuan_K
  • 2016年09月20日 17:11
  • 2019

迭代器失效的几种情况总结

1. 对于序列式容器(如vector,deque),序列式容器就是数组式容器,删除当前的iterator会使后面所有元素的iterator都失效。这是因为vetor,deque使用了连续分配的内存,删...
  • lujiandong1
  • lujiandong1
  • 2015年11月16日 22:11
  • 3300

实战c++中的vector系列--可怕的迭代器失效(vector重新申请内存)

vector给我们提供了很多的方便,但是偶尔也会有陷阱。当不注意的时候,就掉入其中。说到底,还是对vector的机制不够彻底掌握。很轻松的写下这段代码:#include #include using ...
  • wangshubo1989
  • wangshubo1989
  • 2015年12月16日 23:05
  • 3047

关于迭代器失效的一些认识

  • 2011年11月26日 23:28
  • 33KB
  • 下载

c++迭代器失效问题

  • 2015年10月13日 17:14
  • 165KB
  • 下载

迭代器失效小结

  • 2012年12月29日 12:37
  • 728KB
  • 下载

STL — STL迭代器的原理以及迭代器失效

STL迭代器                                                                                              ...
  • Dawn_sf
  • Dawn_sf
  • 2017年09月11日 09:12
  • 506

一个学习迭代器(iterator)的好例子

除了使用下标来访问vector对象的元素外,标准库还提供了另一种访问元素的方法:使用迭代器(iterator)。迭代器是一种检查容器内元素并遍历元素的数据类型。 在学习迭代器的过程中发现了一个好例子...
  • lixinneo
  • lixinneo
  • 2012年10月12日 20:32
  • 743

设计模式—迭代器模式

  • 2016年01月10日 19:50
  • 355KB
  • 下载

聊聊map和vector的迭代器失效问题(某公司招聘笔试试题)

当删除一个STL容器(比如map, vector)中的某个元素时, 会引起迭代器失效, 所以, 我们务必提高警惕。 某次笔试, 我遇到这样一个题目: 删除map中value为5的倍数的元素。 该题看...
  • stpeace
  • stpeace
  • 2015年06月16日 00:12
  • 5510
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:迭代器失效(2)—一个例子
举报原因:
原因补充:

(最多只允许输入30个字)