2016-05-06 2 views
0

В функции класса MainLayer init() я использую статический вектор для хранения указателя блока класса, который расширяет узел. И затем, через 5 секунд (я использую расписание для запуска функции runBlock()), я пытаюсь получить данные, которые хранятся в статическом векторе.Что такое управление памятью в cocos2dx 3.10?

Однако данные, которые я получил, были неправильными. Из отладки я понимаю, что это ошибка памяти. данные, которые я инициализирую, выглядят как удаленные.

Я не понимаю, почему данные были удалены. Пожалуйста, помогите мне, спасибо!

Вот мой код ключа:

MainLayer.cpp

std::vector<block*> MainLayer::block_array = std::vector<block*>(); 
bool MainLayer::init(){ 
    Layer::init(); 
    ... 
    //the schedule 
    schedule(schedule_selector(MainLayer::runBlock), 5.0f, CC_REPEAT_FOREVER, 0.0f); 

    //initialization the data 
    block* b1 = block1::create(); 
    block* b2 = block2::create(); 
    block* b3 = block3::create(); 
    block_array.push_back(b1); 
    block_array.push_back(b2); 
    block_array.push_back(b3); 
    this->addChild(b1->node); 
    this->addChild(b2->node); 
    this->addChild(b3->node); 

    return true; 
} 

void MainLayer::runBlock(float dt){ 
    Size size = Director::getInstance()->getVisibleSize(); 
    int len = block_array.size(); 
    int rand = floor(CCRANDOM_0_1()*len); 
    if (rand == len){ 
     rand -= 1; 
    } 

    //here is the problem, the memory which "bb" point is not be allocated 
    //by the way, the value of bb equals b1 when initialize the data (I mean the memory address is equal, but the data in memory is different) 
    block* bb = block_array[0]; 

    bb->come();   //this is function in class block 
} 

ответ

0

Я глупо !!!

Хотя добавлен узел b1-> Layer, b1 не добавляется. Поэтому в следующем кадре b1 будет переработана.

JUST в MainLayer :: Init() добавить код

b1->retain(); 
b2->retain(); 
b3->retain(); 

все будет нормально

+1

Не забудьте выпустить позже – Striker

+0

Используйте 'Cocos2D :: VECTOR'. Он автоматически сохранит и разблокирует элементы. – Zen