2016-11-24 3 views
0

У меня есть эти строки кодаCocos2d-х RemoveChild работает странно

for (auto view : views) 
{ 
    view->update(deltaTime); 

    if (view->isDead()) 
    { 
     trash.push_back(view); 
     removeChild(view, true); 
    } 
} 

И это разбивает на removeChild(view, true); линии.

Это моя трассировка стека.

ucrtbased.dll!00007ffab25ac2f1() Unknown 
    ucrtbased.dll!00007ffab25af8a5() Unknown 
    TankGame.exe!operator delete(void * block) Line 21 C++ 
    TankGame.exe!operator delete(void * block, unsigned __int64 __formal) Line 16 C++ 
    TankGame.exe!WorldModel::`scalar deleting destructor'(unsigned int) C++ 
    TankGame.exe!std::_Ref_count<WorldModel>::_Destroy() Line 153 C++ 
    TankGame.exe!std::_Ref_count_base::_Decref() Line 113 C++ 
    TankGame.exe!std::_Ptr_base<WorldModel>::_Decref() Line 339 C++ 
    TankGame.exe!std::shared_ptr<WorldModel>::~shared_ptr<WorldModel>() Line 567 C++ 
    TankGame.exe!std::shared_ptr<WorldModel>::operator=(std::shared_ptr<WorldModel> && _Right) Line 555 C++ 
    TankGame.exe!ZombieModel::~ZombieModel() Line 14 C++ 
    [External Code] 
> TankGame.exe!ZombieView::~ZombieView() Line 11 C++ 
    [External Code] 
    libcocos2d_v3.13.1_Windows_10.0.dll!cocos2d::Ref::release() Line 138 C++ 
    libcocos2d_v3.13.1_Windows_10.0.dll!cocos2d::Vector<cocos2d::Node * __ptr64>::erase(__int64 index) Line 443 C++ 
    libcocos2d_v3.13.1_Windows_10.0.dll!cocos2d::Node::detachChild(cocos2d::Node * child, __int64 childIndex, bool doCleanup) Line 1119 C++ 
    libcocos2d_v3.13.1_Windows_10.0.dll!cocos2d::Node::removeChild(cocos2d::Node * child, bool cleanup) Line 1020 C++ 
    libcocos2d_v3.13.1_Windows_10.0.dll!cocos2d::Sprite::removeChild(cocos2d::Node * child, bool cleanup) Line 778 C++ 
    TankGame.exe!WorldView::update(float deltaTime) Line 51 C++ 
    TankGame.exe!GameScene::update(float deltaTime) Line 55 C++ 
    libcocos2d_v3.13.1_Windows_10.0.dll!cocos2d::Scheduler::scheduleUpdate::__l2::<lambda>(float dt) Line 285 C++ 
    [External Code] 
    libcocos2d_v3.13.1_Windows_10.0.dll!cocos2d::Scheduler::update(float dt) Line 861 C++ 
    libcocos2d_v3.13.1_Windows_10.0.dll!cocos2d::Director::drawScene() Line 274 C++ 
    libcocos2d_v3.13.1_Windows_10.0.dll!cocos2d::DisplayLinkDirector::mainLoop() Line 1397 C++ 
    libcocos2d_v3.13.1_Windows_10.0.dll!cocos2d::GLViewImpl::OnRendering() Line 482 C++ 
    libcocos2d_v3.13.1_Windows_10.0.dll!cocos2d::GLViewImpl::Render() Line 474 C++ 
    TankGame.exe!Cocos2dRenderer::Draw(int width, int height, float dpi, Windows::Graphics::Display::DisplayOrientations orientation) Line 137 C++ 
    TankGame.exe!CocosAppWinRT::OpenGLESPage::StartRenderLoop::__l2::<lambda>(Windows::Foundation::IAsyncAction^action) Line 272 C++ 
    [External Code] 

И я не могу получить от меня то, что он хочет. Он вызывает деструктор представления и все! Бам! Разбился! Деструктор представления пуст, и я полностью потерян.

ответ

0

Бьюсь об заклад, вы вызывали код несколько раз.

После этого автоматический просмотр уже удален после того, как вы вызвали removeChild (view, true) один раз, и вы не удалили представление из представлений. Конечно, программа выйдет из строя, когда вы это сделаете, потому что вы пытаетесь удалить вид, который уже удален.

Если моя догадка неверна, вам нужно разместить больше своего кода.

P.S: Ваш код не очень хорош в Cocos2d-x. Вам не нужно собирать мусор, как Java. Вам необходимо изучить управление памятью в Cocos2d-x.

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