2016-11-24 2 views
0

나는 코드적인 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] 

그리고 나에게서 원하는 것을 얻을 수 없습니다. 뷰 소멸자를 호출하면됩니다. 빵! 추락했다! 뷰의 소멸자는 비어 있으며, 나는 완전하게 잃어버린다.

답변

0

여러 번 코드를 호출했을 것입니다.

그런 다음 removeChild (view, true)를 한 번 호출하고 뷰에서 뷰를 제거하지 않으면 자동 뷰가 이미 삭제됩니다. 물론 이미 삭제 된 뷰를 제거하려고하기 때문에 프로그램이 중단 될 때 프로그램이 중단됩니다.

제 추측이 잘못 되었다면 더 많은 코드를 게시해야합니다.

피씨 : Cocos2d-x에서는 코드 스타일이 좋지 않습니다. Java와 같이 휴지통을 수집 할 필요가 없습니다. Cocos2d-x에서 메모리 관리를 공부해야합니다.