Vector.erase(Iterator)导致错误的内存访问

xon*_*n1c 4 c++ vector erase openframeworks

我正在尝试进行videoObjects存储在a中的Z-Index重新排序vector.计划是确定videoObject哪个将被放置在第一个位置vector,擦除它然后将其插入第一个位置.不幸的是,该erase()功能总是导致错误的内存访

这是我的代码:

testApp.h:

vector<videoObject> videoObjects;
vector<videoObject>::iterator itVid;
Run Code Online (Sandbox Code Playgroud)

testApp.cpp:

// Get the videoObject which relates to the user event
for(itVid = videoObjects.begin(); itVid != videoObjects.end(); ++itVid) {
  if(videoObjects.at(itVid - videoObjects.begin()).isInside(ofPoint(tcur.getX(), tcur.getY()))) {
   videoObjects.erase(itVid);
  }
}
Run Code Online (Sandbox Code Playgroud)

这应该是如此简单,但我只是没有看到我在哪里走错了路.

Pét*_*rök 15

你应该做

itVid = videoObjects.erase(itVid);
Run Code Online (Sandbox Code Playgroud)

来自cplusplus.com的报价:

[ vector::erase]使位置第一个之后的所有迭代器和对元素的引用无效.

返回值:一个随机访问迭代器,指向函数调用擦除的最后一个元素后面元素的新位置,如果操作擦除了序列中的最后一个元素,则为向量结束.

更新:您访问条件中当前元素的方式看起来很奇怪.此外,必须避免增加迭代器erase,因为这会跳过一个元素并可能导致越界错误.试试这个:

for(itVid = videoObjects.begin(); itVid != videoObjects.end(); ){
  if(itVid->isInside(ofPoint(tcur.getX(), tcur.getY()))){
    itVid = videoObjects.erase(itVid);
  } else {
    ++itVid;
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 对于使用Visual C++ 2010的任何人:您需要禁用迭代器调试才能使其正常工作(基本上,在这种情况下,迭代器调试无可救药地被破坏):https://connect.microsoft.com/VisualStudio/feedback/details/557029/ (3认同)