我无法从包含std::list
对象的CCNode
中删除项目。尝试erase()
元素时,XCode给出了以下错误:
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,它消失了,节点数减少了一个。问题是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类只是一个CCNode,添加了以下remove()
和spawn()
方法:
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);
}
stacktrace XCode让我只列出cocos2dx的几个内部更新和渲染功能,让我不知道导致崩溃的原因。
答案 0 :(得分:0)
你正在做testList = *new list<TestObject>;
错误。
正确的做法只是
testList = list<TestObject*>();
testList.push_back(new TestObject());
addChild(testList.back());
因为你想存储指针。
在C ++中*new Something
是即时内存泄漏。此外,您将存储对象的副本。