在向量c ++中显示运行时的断言错误

时间:2011-08-24 06:29:37

标签: c++ vector assertion

我想从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++;
        }

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

enter image description here

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

2 个答案:

答案 0 :(得分:2)

删除元素后需要更新迭代器:

socketIterator = vectClientSocket.erase(socketIterator);

另见std :: vector&lt; ..&gt; :: erase(..)documentation

[编辑]

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

for(socketIterator=vectClientSocket.begin();socketIterator!=vectClientSocket.end();){

答案 1 :(得分:1)

这一行之后:

 vectClientSocket.erase(socketIterator);

socketIterator是一个无效的迭代器,因为它用于指向的位置已被擦除。在这一行和你循环的下一次迭代之间你永远不会给它一个有效的值,所以下一次迭代中的这一行是一个无效的解引用。

SOCKET clientSocket=*socketIterator;

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