Cocos2d-x removeChild工作很奇怪

时间:2016-11-24 20:21:23

标签: c++ cocos2d-x

我已经获得了这行代码

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] 

我无法从我那里得到它想要的东西。它称视图为析构函数,它就是它!巴姆!哗啦啦!视图的析构函数是空的,我完全迷失了。

1 个答案:

答案 0 :(得分:0)

我打赌你已多次调用该代码。

然后,在您调用removeChild(view,true)一次后,自动视图已被删除,并且您尚未从视图中删除视图。当然,当你这样做时,程序会崩溃,因为你试图删除已经删除的视图。

如果我猜错了,您需要发布更多代码。

P.S: 你的代码风格在Cocos2d-x中不是很好。您不需要像Java一样收集垃圾。您需要在Cocos2d-x中学习内存管理。