繁体   English   中英

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

[英]Shows an assertion error at runtime in vector c++

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

删除一个元素后,它将显示运行时错误,

在此输入图像描述

请帮助我...谢谢你。

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

socketIterator = vectClientSocket.erase(socketIterator);

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

[编辑]

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

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

在此行之后:

 vectClientSocket.erase(socketIterator);

socketIterator是无效的迭代器,因为它过去指向的位置已被擦除。 在此行与循环中的下一个迭代之间,您永远不会为其提供有效值,因此,在下一个迭代中的此行是无效的取消引用。

SOCKET clientSocket=*socketIterator;

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM