3D应用的程序实现中,为了一个简单的目标:单一的资源通过实例化来复用,以节省内存的开销。实现这个目的,往往会用上一个类,Shared(可以是任何通得过编译器的名字,这里只是用常见的名字)。
class Shared
{
private:
int referenceCount;
protected:
Shared() { referenceCount = 1; }
virtual ~Shared() {}
public:
int GetReferenceCount() const { return referenceCount; }
int Retain() { return ++referenceCount; }
virtual int Release()
{
int count = --referenceCount;
if (count == 0) delete this;
return count;
}
};
解析:
1、referenceCount用来计算对象有多少在使用;
2、默认构造放在protected下,这样保证该类不能单独使用,但是子类继承后构造的时候能调用到父类的构造,因此计数能变成1;
3、Retain()方法是每个继承该类的类对象new出来后必须调用的一个方法,用来让这个复用的对象知道被引用了一次;
4、Release()方法用来做跟3相反的事情,不过不仅是计数减1,还会检查计算是否成0,如果是0了,就释放自己。
5、程序中一般有个Manager之类的东西,会定时查询,用GetReferenceCount()检查referenceCount,从而来实现对象在没有人用的时候释放。在外围看来就是实现了自动化。
// foreach object in manager's list:
if (pObject->GetReferenceCount() == 1)
{
pObject->Release();
}