Question

I want to erase an element from a vector in c++, but it shows a runtime assertion error.

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,

enter image description here

Please help me...thank you in advance.

Was it helpful?

Solution

You need to update your iterator after erasing an element:

socketIterator = vectClientSocket.erase(socketIterator);

see also std::vector<..>::erase(..) documentation

[EDIT]

Use the operator !=(..) to compare the iterators:

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

OTHER TIPS

After this line:

 vectClientSocket.erase(socketIterator);

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.

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top