[英]Shows an assertion error at runtime in vector c++
I want to erase an element from a vector in c++, but it shows a runtime assertion error. 我想从c ++中的向量中删除一个元素,但是它显示了运行时断言错误。
My code is: 我的代码是:
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++;
}
When one element is removed it shows a runtime error, 删除一个元素后,它将显示运行时错误,
Please help me...thank you in advance. 请帮助我...谢谢你。
You need to update your iterator after erasing an element: 您需要在删除元素后更新迭代器:
socketIterator = vectClientSocket.erase(socketIterator);
see also std::vector<..>::erase(..) documentation 另请参见std :: vector <..> :: erase(..) 文档
[EDIT] [编辑]
Use the operator !=(..) to compare the iterators: 使用运算符!=(..)比较迭代器:
for(socketIterator=vectClientSocket.begin();socketIterator!=vectClientSocket.end();){
After this line: 在此行之后:
vectClientSocket.erase(socketIterator);
socketIterator
is an invalid iterator because where it used to point has been erase. socketIterator
是无效的迭代器,因为它过去指向的位置已被擦除。 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. 在此行与循环中的下一个迭代之间,您永远不会为其提供有效值,因此,在下一个迭代中的此行是无效的取消引用。
SOCKET clientSocket=*socketIterator;
As Simon points out, even before this, the loop condition socketIterator<vectClientSocket.end()
will also cause undefined behavior as socketIterator
is no longer a valid iterator into vectClientSocket
. 正如Simon所指出的,即使在此之前,循环条件socketIterator<vectClientSocket.end()
也会引起未定义的行为,因为socketIterator
不再是vectClientSocket
的有效迭代器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.