0

我无法从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,它消失了,并且节点数减少了 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 类只是一个 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 的内部更新和渲染函数,让我不知道是什么导致了崩溃。

4

1 回答 1

0

testList = *new list<TestObject>;做错了。

正确的做法是

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

因为你想存储指针。

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

于 2013-07-30T09:59:08.840 回答