2013-07-25 3 views
0

У меня возникли проблемы с удалением элементов из std::list, содержащих объект CCNode. XCode дает мне следующую ошибку при попытке установить erase() a элемент:Удаление CCNode из std :: list вызывает ошибку в 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() корректно удаляет CCNode из CCLayer, он исчезает, а количество узлов уменьшается на единицу. Проблема в том, что TestObject по-прежнему остается в списке testList, едя память, процессор и испортить игру.

Я написал тестовый пример, чтобы воспроизвести проблему. Вот оно:

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

Вы делаете testList = *new list<TestObject>; неправильно.

Правильный способ сделать это просто

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

как вы хотите сохранить указатели.

В C++ *new Something - это утечка мгновенной памяти. Кроме того, вы сохраните копию объекта.

+0

Спасибо! В конце концов я решил проблему, используя вектор , чтобы отслеживать теги CCNodes. Используя методы addChild (узел CCNode, int zIndex, int tag) и getChildByTagName (int tag), я мог вставлять и получать объекты из родительского CCLayer. Однако ваш совет поможет. –

Смежные вопросы