关闭

c++迭代器失效问题

标签: c++c语言linuxc++迭代器失效coredumped
155人阅读 评论(1) 收藏 举报
分类:

Segentation fault(core dumped)

  在Linux上写程序的时候,我们在调试的时候会出现如标题一样的提示,这说明你的程序访问了非法的内存,用了非法的指针(可能说的不太准确,但一定是你访问了不该访问的内存),其中一种常见的错误就是迭代器的失效问题:
  举个栗子
int arr[6] = {1, 2, 3, 2, 3, 4};
vector<int> v1(arr, arr+6);
for(auto it = v1.begin(); it != v1.end(); it++) {
    if(*it == 2) {
        v1.erase(it);
    }
}

乍一看这是理所当然的操作, 把vector中的2删掉,但不然,当第一个2被删的时候,迭代器已经指向了一个空内存,当执行it++的时候显然不是访问我们想要访问的内存,故出现了内存访问错误。

那么问题来了,正确的操作是怎么样的呢?
为了让大家理解,我们应该要知道vector的erase函数的返回值是所删除元素的下一个空间;
所以正确的代码为:

int arr[6] = {1, 2, 3, 2, 3, 4};

vector<int> v1(arr, arr+6);
auto it = v1.begin();
while(it != v1.end()) {
    if(*it == 2) {
         it = v1.erase(it);
    } else {
         it++;
    }
}

Enjoy coding1


  1. Written by Vilin. Thanks for your reading.
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

c++ STL中容器迭代器失效

参考:http://www.cnblogs.com/yuanshuang/p/5777905.html http://blog.csdn.net/aa838260772/article/details/39678187 序列性容器::(vector和list和deque)...
  • petersmart123
  • petersmart123
  • 2016-11-23 14:07
  • 1016

C++ STL 迭代器失效问题

之前看《C++ Primier》的时候,也解到在顺序型窗口里insert/erase会涉及到迭代器失效的问题,并没有深究。今天写程序的时候遇到了这个问题。 1 莫名其妙的Erase     最初我的程序是酱紫的,别说话,我知道这样是有问题的,可这样是最直观的想法 int arr[]=...
  • coderCong
  • coderCong
  • 2016-07-29 15:03
  • 2491

C++ STL容器迭代器失效

迭代器是封装了指针、重载了 -> 、* 、++等操作符的类模板。迭代器失效,指迭代器指向错误的元素或无效的内存地址。理解迭代器失效,首先要了解容器的内部数据结构、以及该容器存储新元素和删除旧元素时的内存状态。
  • u010599509
  • u010599509
  • 2016-07-21 15:57
  • 768

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

1. 对于序列式容器(如vector,deque),序列式容器就是数组式容器,删除当前的iterator会使后面所有元素的iterator都失效。这是因为vetor,deque使用了连续分配的内存,删除一个元素导致后面所有的元素会向前移动一个位置。所以不能使用erase(iter++)的方式,还好e...
  • lujiandong1
  • lujiandong1
  • 2015-11-16 22:11
  • 3346

STL的erase()陷阱-迭代器失效总结

下面材料整理自Internet&著作。   STL中的容器按存储方式分为两类,一类是按以数组形式存储的容器(如:vector 、deque);另一类是以不连续的节点形式存储的容器(如:list、set、map)。在使用erase方法来删除元素时,需要注意一些问题。 1.list,set,...
  • liujianfei526
  • liujianfei526
  • 2016-08-12 00:04
  • 528

deque 迭代器失效的问题详解

今天在看STL源码的时候,无意写了如下的代码,发现程序崩溃了: deque::iterator iter=d.begin(); d.insert(iter,5); d.insert(iter,6); //崩溃,迭代器失效了 之前一直没有留意这个问题,后来结合源码和查...
  • monkey_D_feilong
  • monkey_D_feilong
  • 2016-07-04 21:58
  • 1129

C++关于迭代器删除(erase)插入(insert)失效问题

初学者的我在学习迭代器的时候(今天这里主要说的是vector的迭代器)碰到了一些问题,纠结了好些时候,总算弄明白了一点。 迭代器会在删除插入等操作后失效,即在其删除插入位置后的迭代器会失效,那所谓的失效是什么意思? 失效一般是指迭代器指向了和你预期不一样的位置了,但这个时候,你可以通过自...
  • a327369238
  • a327369238
  • 2014-05-23 16:06
  • 1310

关于STL中map的erase迭代器是否失效的讨论

近来,在阅读一份开源代码的时候,看到了类似如下的代码:typedef std::map id_names_t; id_names_t id_names; void EraseName(std::string name) { id_names_t::iterator it = id_names.b...
  • haust_wang
  • haust_wang
  • 2015-10-21 10:16
  • 2083

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

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

C++学习之deque底层存储结构与迭代器失效情况

C++ STL容器deque和vector很类似,也是采用动态数组来管理元素。 使用deque之前需包含头文件: #include 它是定义在命名空间std内的一个class template: template     class _Ax = all...
  • xhu_eternalcc
  • xhu_eternalcc
  • 2014-08-03 09:22
  • 1117
    个人资料
    • 访问:2753次
    • 积分:156
    • 等级:
    • 排名:千里之外
    • 原创:11篇
    • 转载:3篇
    • 译文:0篇
    • 评论:31条
    文章分类