前面的内存池只是提供了内存分配的功能。为了能方便地使用,还需要一些其它的设施。
单例
把内存池弄成单例类,用起来会比较方便。因为这样就可以在任何地方,通过类方法得到内存池的实例,即便内存池是在某个看不到的地方建立的。而且可以保证每种类型的池子只有一个。
单例类通常都这样实现:类里面有一个静态属性,存有一个实例,并且通过类方法访问这个实例。构造器保证实例只有一个。
template <typename T> class Singleton {
public:
// 存储一个实例
static T* instance;
// 实例的访问函数
// 懒得检查instance是否非零
inline static T& get_instance()
{
return *instance;
}
inline static T* get_instance_ptr()
{
return instance;
}
// 构造的时候将自己存在类属性中
Singleton()
{
// 其实应当先检查一下是否已经存在,如果instance已经被初始化就死掉
instance = static_cast <T*> (this);
}
// 懒得写析构函数,析构的时候应当将instance清零
protected:
// 不得复制
Singleton(const Singleton<T>&);
Singleton& operator=(const Singleton<T> &);
};
// 类属性的定义,给0初值
template <typename T>
T* Singleton<T>::instance = 0;
然后,修改一下内存池,让其继承singleton类:
template<typename T> class MemPool: public Singleton< MemPool<T> >
{
//......
};
之后,不管在哪里就可以在任何地方通过MemPool<T>::get_instance()得到T类型的内存池实例。