2 robinsonz robinsonZ 于 2017.01.13 00:08 提问

c++ stl使用erase什么时候会崩溃

it里面的成员对象可以取到值(string类型),但是在擦除的时候崩溃了,没有用
it=vec.erase(it)这种形式,it++也没写在for里面,请问是什么情况导致的?
附言:断点执行到vec.erase(it)的时候再按F11就崩

上个代码方便看问题:
void class::Delete(string lpName)
{
std::vector::iterator it = m_structList.begin();

    for(;it != m_structList.end();)
    {
        if(it->Name == lpName)
        {
            it = m_structList.erase(it);
            continue;
        }
        ++it;
    }
}
这个是删除容器元素的方法,没添加这个之前不会崩溃
程序功能是元素使用完后要被删除,所以下面这个也是删除的功能,先执行完上面这个,再执行下面这个:
        try {
        for(;it != m_structList.end();)
        {
            str = it->Name;//此处Name可以取到值
                if(it->MsgRet == -1)
                {
                    it = m_structList.erase(it);
                    continue;
                }
                if(LUA_YIELD != it->ret )
                {
                    it = m_structList.erase(it);//在name可以取到值的时候,断点到这里F11崩溃
                    continue;
                }

            ++it;
        }

    }
    catch( ... )
    {
    }

4个回答

oyljerry
oyljerry   Ds   Rxr 2017.01.13 07:40
已采纳

上面没贴全

 for(iter = member.begin(); iter != member.end();)
{
    if(*iter == 2)
    {
        iter = member.erase(iter);
    }
    else
    {
        iter++;
    }
}

robinsonZ
robinsonZ 问题更新啦~如果有空可以看一下
一年多之前 回复
oyljerry
oyljerry   Ds   Rxr 2017.01.13 07:39

{
    if(*iter == 2)
    {
        iter = member.erase(iter);
    }
    else
    {
        iter++;
    }
}

a29562268
a29562268   2017.01.13 08:14

用过erase函数后要break退出循环,因为迭代器内的数据不是连续的了,我有篇list容器采用接收地址,可以避免这种情况

robinsonZ
robinsonZ 问题更新啦~如果有空可以看一下,我感觉好像并没有写错。。
一年多之前 回复
u011261430
u011261430   2017.01.14 11:53

直接m_structList.erase(it++);

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
STL 使用 erase 删除元素时 iterator 失效
STL中的容器按存储方式分为两类:一类是序列容器(如:vector,deque),另一类是关联容器(如:list,map,set)。 在使用erase方法删除元素时,有几点需要注意: 1) 对于关联容器(如map, set,multimap,multiset),删除当前的iterator,仅仅会使当前的iterator失效,只要在erase时,递增当前iterator即可。这是因为
map erase 内存释放问题
资料出处:http://www.cnblogs.com/goodness/archive/2012/05/16/2503832.html 研究了下c++中map的内存占用情况。很多人说map中的erase以及clear不能释放内存,这几天实验了下,这个说法是不确切的,较为准确的说法应该是,map中的erase以及clear,不能,“马上”释放内存。map有自己的机制回收内存,用erase以及clea
STL list erase 删除一个节点后,迭代器会失效吗
STL list erase 删除一个节点后,迭代器会失效吗
STL中list的erase()方法的使用
STL中list的erase()方法的使用 2009-11-27 01:38 2250人阅读 评论(2) 收藏 举报 listiterator  最近刚刚接触stl的list    学习的时候遇到了很多的困难   现在记录一下   主要是erase方法的使用   erase()方法是删除iterator指定的节点  但是要注意的是在执行完此函数的时候iterator也被销
C++/STL_中vector基本操作测试代码,vector.erase()使用方法
通过vector我们可以减少类里的变量,比如一个类里存储了一个数据但是不知道这个数据到底要存储个,我们常常使用结构体数组加一个变量来记录存储记录的数量,但是通过vector可以简化这个变量,因为vector里面有通用的size方法可以帮我们完成这个操作。 测试代码: #include #include using namespace std; struct Point{ in
关于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.begin(); while(it != id_names.end()) { if(it->s
C++ STL容器中erase的使用
erase()函数的功能是用来删除容器中的元素 函数原型: iterator erase(iterator where); iterator erase(iterator first,iterator last); basic_string& erase(size_type p0=0,size_type n=np); 删除某个容器里的某个元素:c.erase(T); 看似一个简
STL map 内存改变,迭代器失效,crash
http://blog.163.com/cp7618@yeah/blog/static/702347772012114103640735/ 问题描述 游服文件TGameObjmap.h类TGameObjMap封装使用std::map, 在使用过程中会出现crash. 原因分析 我们发现在使用TGameObjMap中,由于多线程没同步好或在使用迭代器同时内存改变,才导致的crash
没有躲过的坑--vector使用erase后迭代器变成野指针
vector上镜率非常高,但是最近又被他fuck了一下。使用的就是vector的erase方法。erase–return value 首先需要明确一下vector的两种erase:C++98中是这样的:iterator erase (iterator position); iterator erase (iterator first, iterator last)C++11是这样的:iterat
STL中迭代器失效详解
深入探讨vector、list迭代器为什么会失效,以及怎样解决迭代器失效。