请教如何正确释放CCSpriteFrame的问题

在使用 cocos2d-x 过程中,遇到了一个如何正确释放CCSpriteFrame的问题,请教一下。
在Visual Studio下遇到如下所示的错误提示信息:
This may be due to a corruption of the heap, which indicates a bug in XXXXX.exe or any of the DLLs it has loaded.

我的代码大概完成这个目的:创建CCSpriteFrame用于显示精灵动画,然后将CCSpriteFrame释放掉。
大概流程如以下代码所示:

CCSpriteFrameCache* cache = CCSpriteFrameCache::sharedSpriteFrameCache();
cache->addSpriteFramesWithFile(“sprite.plist”);

CCMutableArray<CCSpriteFrame*>* pAnimFrames = new CCMutableArraycocos2d::CCSpriteFrame*(3);
CCSpriteFrame* spriteFrame1 = cache->spriteFrameByName(“animation_1.png”);
CCSpriteFrame* spriteFrame2 = cache->spriteFrameByName(“animation_2.png”);
CCSpriteFrame* spriteFrame3 = cache->spriteFrameByName(“animation_3.png”);

pAnimFrames->addObject(spriteFrame1)
pAnimFrames->addObject(spriteFrame2)
pAnimFrames->addObject(spriteFrame3)

for(int i=0; icount(); i++)
{
CCSpriteFrame* pSpriteFrame = pAnimFrames->getObjectAtIndex(i);
if(pSpriteFrame)
{
pSpriteFrame->release();
}
}
delete pAnimFrames;

问题就出在了pSpriteFrame->release()这一行。如果我把这行删掉,就没有错误了。

问题:
1.请高手指点怎么正确释放CCSpriteFrame对象。
2.cocos2d-x释放对象的原则是什么?比如用哪个API创建的对象需要开发者自己调用release()去释放的等等此类问题。

spriteFrameByName创建的对象是自动释放的,不需要release

— Begin quote from ____

虚无流星 发表于 2012-4-20 21:47 url

spriteFrameByName创建的对象是自动释放的,不需要release

— End quote

根据我的理解,当调用 release() 之后,对象计数减一,如果是 0 的话就会被自动释放,所以如果不调用 release() 怎么会触发自动释放操作呢?

好像是,delete pAnimFrames;的时候,会调用pAnimFrames的析构函数,析构函数会调用removeAllObjects,会重复对所有对象进行release,就会两次release。。

— Begin quote from ____

carmack2000 发表于 2012-4-21 04:45 url

根据我的理解,当调用 release() 之后,对象计数减一,如果是 0 的话就会被自动释放,所以如果不调用 rel …

— End quote

new方式创建的才release,spriteFrameByName创建的不用。
spriteFrameByName内设置了autorelease,用完引擎会自动释放掉。

这里你把for…部分删掉,
delete pAnimFrames; 改为pAnimFrames->release;应该就不会出错了。

— Begin quote from ____

虚无流星 发表于 2012-4-22 20:01 url

new方式创建的才release,spriteFrameByName创建的不用。
spriteFrameByName内设置了autorelease,用完引 …

— End quote

谢谢你的回答。:smiley: