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

发布于 2024-12-01 15:03:26 字数 923 浏览 0 评论 0 原文

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

当删除一个元素时,它会显示运行时错误,

在此处输入图像描述

请帮助我...谢谢你提前。

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.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

贪恋 2024-12-08 15:03:26

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

socketIterator = vectClientSocket.erase(socketIterator);

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

[编辑]

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

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

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();){
南城旧梦 2024-12-08 15:03:26

在这一行之后:

 vectClientSocket.erase(socketIterator);

socketIterator 是一个无效的迭代器,因为它曾经指向的位置已被删除。在这一行和循环中的下一次迭代之间,您从未给它提供有效值,因此下一次迭代中的这一行是无效的取消引用。

SOCKET clientSocket=*socketIterator;

正如 Simon 指出的,即使在此之前,循环条件 socketIterator 也会导致未定义的行为,因为 socketIterator 不再是 的有效迭代器vectClientSocket

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文