一个内存分配器 模板基类
2012-11-24 11:34
267 查看
#include <iostream>
#include <algorithm>
template<typename T> class Cached
{
public :
void * operator new(size_t size);
void operator delete(void *, size_t size);
~Cached(){}
protected:
T * next;
private:
static T * freeStore;
static size_t count;
static void addToFreeList(T*);
static std::allocator<T> alloc;
};
template<typename T> T * Cached<T>::freeStore=0;
template<typename T> size_t Cached<T>::count =2;
template<typename T> std::allocator<T> Cached<T>::alloc;
template<typename T> void Cached<T>::addToFreeList(T* ptr)
{
ptr->next=freeStore;
freeStore=ptr;
}
template<typename T> void * Cached<T>::operator new(size_t size)
{
if(size!=sizeof(T))
throw std::runtime_error("error occur in function operator new ,because of wrong size");
if(!freeStore)
{
T * ptr=alloc.allocate(count);
for(int i=0;i!=count;++i)
{
(ptr+i)->next=freeStore;
freeStore=(ptr+i);
}
}
T * ret=freeStore;
freeStore=freeStore->next;
return ret;
}
template< typename T> void Cached<T>::operator delete(void * ptr,size_t size)
{
Cached<T>::addToFreeList(static_cast<T*>(ptr));
}
class A:public Cached<A>
{
public:
A():a(9),b(3){}
int a,b;
void show(){std::cout<<a<<b<<std::endl;}
};
int main(int argc,char * argv[])
{
A *obj=new A();
A *obj1=new A();
A *obj2=new A();
delete obj2;
obj1->show();
::system("pause");
return 0;
}
#include <algorithm>
template<typename T> class Cached
{
public :
void * operator new(size_t size);
void operator delete(void *, size_t size);
~Cached(){}
protected:
T * next;
private:
static T * freeStore;
static size_t count;
static void addToFreeList(T*);
static std::allocator<T> alloc;
};
template<typename T> T * Cached<T>::freeStore=0;
template<typename T> size_t Cached<T>::count =2;
template<typename T> std::allocator<T> Cached<T>::alloc;
template<typename T> void Cached<T>::addToFreeList(T* ptr)
{
ptr->next=freeStore;
freeStore=ptr;
}
template<typename T> void * Cached<T>::operator new(size_t size)
{
if(size!=sizeof(T))
throw std::runtime_error("error occur in function operator new ,because of wrong size");
if(!freeStore)
{
T * ptr=alloc.allocate(count);
for(int i=0;i!=count;++i)
{
(ptr+i)->next=freeStore;
freeStore=(ptr+i);
}
}
T * ret=freeStore;
freeStore=freeStore->next;
return ret;
}
template< typename T> void Cached<T>::operator delete(void * ptr,size_t size)
{
Cached<T>::addToFreeList(static_cast<T*>(ptr));
}
class A:public Cached<A>
{
public:
A():a(9),b(3){}
int a,b;
void show(){std::cout<<a<<b<<std::endl;}
};
int main(int argc,char * argv[])
{
A *obj=new A();
A *obj1=new A();
A *obj2=new A();
delete obj2;
obj1->show();
::system("pause");
return 0;
}
相关文章推荐
- 一个支持线程安全的模板方式实现的内存分配器
- 推荐一个跨平台内存分配器TCmalloc
- allegro设置内存分配器的一个坑
- 推荐一个跨平台内存分配器 - feixuwu - C++博客
- 推荐一个跨平台内存分配器tcmalloc用在3D游戏上
- 如何设计一个内存分配器
- 一个类有多个基类的内存布局
- Nah Lock: 一个无锁的内存分配器
- 推荐一个跨平台内存分配器【转载】
- 一个Win32 C++ 动态连接库的模板 --- 调用方可管理DLL分配的内存
- 一个Win32 C++ 动态连接库的模板 --- 调用方可管理DLL分配的内存
- 定义一个函数模板,为指定的数据类型分配内存。
- 一个用模板实现的计数基类
- 一个Win32 C++ 动态连接库的模板 — 调用方可管理DLL分配的内存
- 推荐一个跨平台内存分配器
- Windows编程 在一个模块中分配的内存在另外一个模块释放?
- 自己实现一个内存缓存
- 黑马程序员 oc随记 写一个手动内存释放
- C++模板写的一个单例设计模式类
- 内存管理器(三)使用边界标识法实现内存分配器