在向量 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++;
}
当删除一个元素时,它会显示运行时错误,
请帮助我...谢谢你提前。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您需要在删除元素后更新迭代器:
另请参阅 std::vector<..>::erase(..) 文档
[编辑]
使用运算符 !=(..) 比较迭代器:
You need to update your iterator after erasing an element:
see also std::vector<..>::erase(..) documentation
[EDIT]
Use the operator !=(..) to compare the iterators:
在这一行之后:
socketIterator
是一个无效的迭代器,因为它曾经指向的位置已被删除。在这一行和循环中的下一次迭代之间,您从未给它提供有效值,因此下一次迭代中的这一行是无效的取消引用。正如 Simon 指出的,即使在此之前,循环条件
socketIterator 也会导致未定义的行为,因为
socketIterator
不再是的有效迭代器vectClientSocket
。After this line:
socketIterator
is an invalid iterator because where it used to point has been erase. Between this line and the next iteration through your loop you never give it a valid value so this line in the next iteration is an invalid dereference.As Simon points out, even before this, the loop condition
socketIterator<vectClientSocket.end()
will also cause undefined behavior assocketIterator
is no longer a valid iterator intovectClientSocket
.