c++迭代器失效问题

标签: c++ c语言 linux c++迭代器失效 coredumped
224人阅读 评论(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.
查看评论

一步一步用Delphi6实现Web Service

      本文介绍的是如何用Delphi6开发Web Service程序,并把服务程序放在IIS Web服务器上提供给各种客户程序调用。一编写服务程序第一步:File----->New----->O...
  • coala
  • coala
  • 2001-10-26 11:27:00
  • 727

C++ STL 迭代器失效问题

之前看《C++ Primier》的时候,也解到在顺序型窗口里insert/erase会涉及到迭代器失效的问题,并没有深究。今天写程序的时候遇到了这个问题。 1 莫名其妙的Erase     最初我...
  • coderCong
  • coderCong
  • 2016-07-29 15:03:42
  • 3270

C++ 迭代器失效

众所周知当使用一个容器的insert或者erase函数通过迭代器插入或删除元素"可能"会导致迭代器失效,因此很多建议都是让我们获取insert或者erase返回的迭代器,以便用重新获取新的有效的迭代器...
  • zhongjiekangping
  • zhongjiekangping
  • 2010-05-26 11:43:00
  • 11767

C++ vector 迭代器失效原因

众所周知,vector在内存中是顺序存储的,那么当vector的长度增加时,也就是往里面继续pushback新的数据,当前块的内存不够,vector不得不重新申请一块新的更大的内存,然后把之前的数据复...
  • jeffdeen
  • jeffdeen
  • 2016-12-04 14:59:09
  • 835

C++ STL 迭代器失效

c++ STL迭代器失效总结
  • zxx910509
  • zxx910509
  • 2015-12-18 09:43:10
  • 470

C++ STL容器迭代器失效

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

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

参考:http://www.cnblogs.com/yuanshuang/p/5777905.html http://blog.csdn.net/aa838260772/article/deta...
  • petersmart123
  • petersmart123
  • 2016-11-23 14:07:29
  • 1192

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

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

deque及迭代器失效问题

deque由一段一段的定量连续空间构成,采用一个表(map)来记录每个连续空间的首址,map是一小块连续的空间,目的是便于迭代器的寻址(map+1即可跳转到下一个连续空间的首址)。map中的每一个元素...
  • ww32zz
  • ww32zz
  • 2015-09-05 15:18:04
  • 1463

STL源码剖析---迭代器失效小结

迭代器(iterator)是一个可以对其执行类似指针的操作(如:解除引用(operator*())和递增(operator++()))的对象,我们可以将它理解成为一个指针。但它又不是我们所谓普通的指针...
  • Hackbuteer1
  • Hackbuteer1
  • 2012-07-10 21:32:20
  • 11186
    个人资料
    持之以恒
    等级:
    访问量: 3433
    积分: 178
    排名: 91万+
    文章分类