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 问题更新啦~如果有空可以看一下
11 个月之前 回复
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 问题更新啦~如果有空可以看一下,我感觉好像并没有写错。。
11 个月之前 回复
u011261430
u011261430   2017.01.14 11:53

直接m_structList.erase(it++);

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!