簡體   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