2016-11-24 7 views
0

Ich habe diese Zeilen Code bekamCocos2d-x removeChild wierd arbeitet

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

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

Und es bricht bei removeChild(view, true); Linie.

Dies ist mein Stack-Trace.

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] 

Und ich kann nicht bekommen, was es von mir will. Es ruft einen View Destructor auf und das war's! Bam! Abgestürzt! Destruktor der Ansicht ist leer und ich bin komplett verloren.

Antwort

0

Ich wette, Sie haben den Code für mehrere Male aufgerufen.

Dann ist die automatische Ansicht bereits gelöscht, nachdem Sie removeChild (view, true) einmal aufgerufen haben und Sie die Ansicht nicht aus den Ansichten entfernt haben. Natürlich wird das Programm abstürzen, wenn Sie es dreimal tun, weil Sie versuchen, eine bereits gelöschte Ansicht zu entfernen.

Wenn meine Vermutung falsch ist, müssen Sie mehr von Ihrem Code veröffentlichen.

S.S. Ihr Code-Stil ist in Cocos2d-x nicht sehr gut. Sie müssen keinen Müll wie Java sammeln. Sie müssen die Speicherverwaltung in Cocos2d-x studieren.