c++内存机制,采用new关键字实例化的对象,必须在不使用的时候手动delete掉,否则new的时候开辟的内存就不能被回收,造成内存泄露
Npc * n1=new Npc();
if(exit=0)
{ delete n1;
}
cocos2d-x 内存管理的方式,cocos2d-x采用引用计数的方式进行内存管理,当一个对象的引用计数为0的时候,就会被引擎自动delete掉
在cocos2d-x中绝大多数类继承CCObject
CCObject::CCObject(void)
{
static unsigned int uObjectCount = 0;
m_uID = ++uObjectCount; // 对象id
m_nLuaID = 0;
m_uReference = 1; //引用计数
m_bManaged = false; //是否自动autorelease
}
void CCObject::release(void) //减少引用
{
CCAssert(m_uReference > 0, "reference count should greater than 0");
--m_uReference;
if (m_uReference == 0)
{
delete this;
}
}
void CCObject::retain(void) //增加引用
{
CCAssert(m_uReference > 0, "reference count should greater than 0");
++m_uReference;
}
//////////////////////////////////////////自动处理
CCObject* CCObject::autorelease(void)
{
CCPoolManager::sharedPoolManager()->addObject(this);
m_bManaged = true;
return this;
}
CCObject::~CCObject(void)
{
if (m_bManaged)
{
CCPoolManager::sharedPoolManager()->removeObject(this);
}
}
//////////////////////////////////////////////////////////////////// 自动释放池的释放是在哪里呢?大家可以研究下源码
在调试过程中可以跟踪对象的
m_uReference = 1; //引用计数
m_bManaged = false; //是否自动autorelease
这2个值来检查内存使用。
法则: 只要retain的放对应相同的release