1

我想从 C++ 中的向量中删除一个元素,但它显示运行时断言错误。

我的代码是:

   int i=0;
        for(socketIterator=vectClientSocket.begin();socketIterator!=vectClientSocket.end();){
            SOCKET clientSocket=*socketIterator;

            isTrue=getBufferData(strt,stp,rm,clientSocket);
            if(!isTrue){
                vectClientSocket.erase(vectClientSocket.begin()+i);

                vector<RMLObserver*>::iterator it;
                for(it=vectRMLObserver.begin();it<vectRMLObserver.end();it++)
                {
                    RMLObserver *observer = (RMLObserver*)*it;
                    observer->infosetSent(info->getRMLThinTranskportToken());
                }
            }
            else
                ++socketIterator;

            i++;
        }

当一个元素被移除时,它会显示一个运行时错误,

在此处输入图像描述

请帮助我......提前谢谢你。

4

2 回答 2

2

擦除元素后,您需要更新迭代器:

socketIterator = vectClientSocket.erase(socketIterator);

另见 std::vector<..>::erase(..)文档

[编辑]

使用运算符 !=(..) 比较迭代器:

for(socketIterator=vectClientSocket.begin();socketIterator!=vectClientSocket.end();){
于 2011-08-24T06:34:00.207 回答
1

在这一行之后:

 vectClientSocket.erase(socketIterator);

socketIterator是一个无效的迭代器,因为它曾经指向的位置已被擦除。在此行和循环中的下一次迭代之间,您永远不会给它一个有效值,因此下一次迭代中的这一行是无效的取消引用。

SOCKET clientSocket=*socketIterator;

正如西蒙指出的那样,即使在此之前,循环条件socketIterator<vectClientSocket.end()也会导致未定义的行为,因为socketIterator它不再是一个有效的迭代器vectClientSocket

于 2011-08-24T06:34:58.400 回答