I overridded onExit() and added a new sprite to anthoer node(eg, parent). while exit, the app crashes at
CCTexture2D::~CCTexture2D() {
glDeleteTextures(1, &m_uName); // CRASH !!!
I found all other Sprites/Textures were deallocated in CCDirector::purgeDirector(), but that new Sprite, created in onExit(), was deallocated in CCDirector()::~CCDirector(),
because it’s retained by AutoReleasePool…
libcocos2d.dll!cocos2d::CCTexture2D::`vector deleting destructor'() + 0x69 字节 C++
libcocos2d.dll!cocos2d::CCObject::release() 行 84 + 0x35 字节 C++
libcocos2d.dll!cocos2d::CCSprite::~CCSprite() 行 333 C++
libcocos2d.dll!cocos2d::CCSprite::`vector deleting destructor'() + 0x6c 字节 C++
libcocos2d.dll!cocos2d::CCObject::release() 行 84 + 0x35 字节 C++
libcocos2d.dll!cocos2d::CCMutableArray::removeAllObjects(bool bDeleteObject) 行 230 + 0xf 字节 C++
libcocos2d.dll!cocos2d::CCAutoreleasePool::clear() 行 79 C++
libcocos2d.dll!cocos2d::CCPoolManager::pop() 行 149 C++
> libcocos2d.dll!cocos2d::CCDirector::~CCDirector() 行 151 C++
libcocos2d.dll!cocos2d::CCDisplayLinkDirector::~CCDisplayLinkDirector() + 0x2b 字节 C++
libcocos2d.dll!cocos2d::`dynamic atexit destructor for 's_sharedDirector''() + 0x28 字节 C++
libcocos2d.dll!_CRT_INIT(void * hDllHandle, unsigned long dwReason, void * lpreserved) 行 415 C
libcocos2d.dll!__DllMainCRTStartup(void * hDllHandle, unsigned long dwReason, void * lpreserved) 行 526 + 0x11 字节 C
libcocos2d.dll!_DllMainCRTStartup(void * hDllHandle, unsigned long dwReason, void * lpreserved) 行 476 + 0x11 字节 C
Why did glDeleteTextures() crash? Guess the opengl context had been destroyed?
codes to reproduce:
class TestNode : public CCNode {
public:
virtual void onExit() {
CCNode::onExit();
CCSprite *node = CCSprite::spriteWithFile("CloseSelected.png");
getParent()->addChild(node);
}
};
CCScene* HelloWorld::scene()
{
CCScene *scene = CCScene::node();
HelloWorld *layer = HelloWorld::node();
scene->addChild(layer);
TestNode *tn = new TestNode();
tn->autorelease();
layer->addChild(tn);
return scene;
}