从std :: list中删除CCNode会导致XCode出错

时间:2013-07-25 16:30:11

标签: c++ cocos2d-x

我无法从包含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的几个内部更新和渲染功能,让我不知道导致崩溃的原因。

1 个答案:

答案 0 :(得分:0)

你正在做testList = *new list<TestObject>;错误。

正确的做法只是

testList = list<TestObject*>();
testList.push_back(new TestObject());
addChild(testList.back());

因为你想存储指针。

在C ++中*new Something是即时内存泄漏。此外,您将存储对象的副本。