std::list
含まれているオブジェクトからアイテムを削除するのに問題がありCCNode
ます。要素にアクセスしようとすると、XCode で次のエラーが表示されますerase()
。
error: address doesn't contain a section that points to a section in a object file
.
またはこのエラー:
EXC_BAD_ACCESS code=2
アセンブリ ファイルで。
また、次の場所でクラッシュすることもあります。
ccGLBindTexture2D( m_pobTexture->getName() );
私に EXC_BAD_ACCESS を与えます。
アプリケーションを実行するたびに、これらのエラーのいずれかが発生します。
remove() メソッドは、CCLayer から CCNode を正しく削除します。CCNode は消え、ノード数は 1 つ減ります。問題は、TestObject がまだ testList リストに残り、メモリと CPU を食い尽くし、ゲームを台無しにすることです。
問題を再現するテストケースを書きました。ここにあります:
testList = *new list<TestObject>;
testList.push_back(*new TestObject());
addChild(&testList.back());
testList.back().spawn();
testList.back().remove();
std::list<TestObject>::iterator test = testList.begin();
while (test != testList.end())
{
if(test->isRemoved){
testList.erase(test++);
}
}
TestObject クラスは、次remove()
のspawn()
メソッドが追加された単純な CCNode です。
TestObject::TestObject(){
sprite = *CCSprite::createWithTexture(MainScene::hostileship_tex);
}
void TestObject::spawn(){
CCSize size = sprite.getTexture()->getContentSize();
this->setContentSize(size);
this->addChild(&sprite);
}
void TestObject::remove(){
GameLayer::getInstance().removeChild(this, true);
}
XCode のスタック トレースは、cocos2dx の内部更新およびレンダリング関数をいくつかリストするだけで、クラッシュの原因がわかりません。