Cocos2d-x Vector——vector iterators incompatible

Posted wzjhoutai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Cocos2d-x Vector——vector iterators incompatible相关的知识,希望对你有一定的参考价值。

***************************************转载请注明出处:http://blog.csdn.net/lttree******************************************



使用 cocos2d-x 中的 Vector的时候,

在删除某个对象的时候出现了个错误,非常崩溃啊.....

Vector<Bullet*>* bullets;


// 遍历每一个bullet,让他们自己更新
for ( auto it = bullets->begin();it!=bullets->end();it++)
{
  (*it)->update();

  // 获取子弹生命。若子弹已经消亡,释放
  if( (*it)->getLife() )	{
			
    Bubblet* b = *it;

    bubblets->eraseObject(b);
    this->removeChild( b,true );
  }
		 
}

就会错误发生——vector iterators incompatible。

也许是我 打开的方式不正确。于是用C++11方法:

Vector<Bullet*> bullets;

for( auto& b : bullets )  {
  b->update();

  if( b->getLife() )  {
    bubblets.eraseObject(b);
    this->removeChild(b,true);
  }

}

还是不行。。。

找了非常久,发现,

据说是由于,迭代器遍历的时候。假设把当前的给删除了,那么后面就乱套了,无法继续进行下去了,

所以。会崩溃。


于是乎。假设通过迭代器来遍历,就这么改:

// 遍历每一个bullet。让他们自己更新
for ( auto it = bullets->begin();it!=bullets->end();)
{
  (*it)->update();

  // 获取子弹生命,若子弹已经消亡,释放
  if( (*it)->getLife() )	{
			
    Bubblet* b = *it;

    it = bubblets->eraseObject(b);
    this->removeChild( b,true );
  }
  else  {
    it++;
  }
		 
}

迭代器的移动,不再靠循环。而是靠推断语句。


可惜。通过C++11方法的遍历,我还没想到要怎么改。。。







***************************************转载请注明出处:http://blog.csdn.net/lttree******************************************

以上是关于Cocos2d-x Vector——vector iterators incompatible的主要内容,如果未能解决你的问题,请参考以下文章

Cocos2d-x中Vector&lt;T&gt;容器以及实例介绍

关于Cocos2d-x数据类型的使用

cocos2d-x 3.3 之卡牌设计 NO.4 定时器的使用(清理内存)

数组与字符串三(Cocos2d-x 3.x _Array容器)

Part 13:Cocos2d-x开发实战-Cocos2d-x中使用的数据容器类-关东升-专题视频课程

cocos2d-x 中XML解析与数据存储