在for循环中删除迭代器所指内容崩溃

经常在网上看到“容器中删除的只要不是最后一个元素,循环就会崩溃”

其实不然,经过测试;容器中使用迭代器循环访问,只要删除迭代器所指元素后,继续for,不管你删除的是第一个还是最后一个,或者中间的某一个,只要不跳出来,就会崩溃;

首先,for循环,++或者--,都是在for循环体执行完一次后执行;所以当你把迭代器所指内容删除,迭代器失效,失效的迭代器在++,或者--,就会崩溃

其次,try catch是拦截throw抛出的异常的,并不能捕获崩溃;

#include <iostream>
#include<map>

//使用改代码,测试多加几个元素到map,无论你删除中间的某一个,还是首尾,只要是循环再++,就会崩溃
int main()
{
    bool flag;
    std::map<std::string, std::string>m_DevMap;
    m_DevMap.insert(std::pair<std::string, std::string>("1", "one"));
    
    std::map<std::string, std::string>::iterator itor = m_DevMap.begin();
    std::string deviport = "1";
    try {
        for (; itor != m_DevMap.end(); itor++)
        {
            std::cout << "dele----111";
            if (strcmp(deviport.c_str(), itor->first.c_str()) == 0)
            {
                if (itor->second != "")
                {
                    std::cout << "dele----222";

                }

                m_DevMap.erase(itor);
                flag = true;

            }
        }
    }
    catch (...)
    {
        std::cout << "dele----333";
    }
    
    return flag;
}

 

 

posted on 2024-03-22 19:00  邗影  阅读(11)  评论(0编辑  收藏  举报

导航