18.1.7 一个内存分配器基类
需要怎样改进内置库的new和delete函数?一个通用策略是预先分配一块原始内存来保存未构造的对象,创建新元素的时候,可以在一个预先分配的对象中构造;释放元素的时候,将它们放回预先分配的块中,而不是将内存实际返还给系统。这种策略常被称为维持一个自由列表(freelist)。可以将自由列表实现为已分配但未构造的对象的链表。
1. CachedObj
template
class CachedObj{
public:
void *operator new(size_t);
void operator delete(void*,size_t);
virtual ~CachedObj(){}
protected:
T *next;
private:
static void add_to_freelist(T*);
static std::allocator
static T *freestore;
static const void std::size_t chunk;
};
template
class CachedObj{
public:
void *operator new(size_t);
void operator delete(void*,size_t);
virtual ~CachedObj(){}
protected:
T *next;
private:
static void add_to_freelist(T*);
static std::allocator
static T *freestore;
static const void std::size_t chunk;
};2. 使用CachedObj
template
class QueueItem1:public CachedObj
template
class QueueItem1:public CachedObj
QueueItem1
QueueItem1
(1)使用 QueueItem
(2)为类型T使用元素类型的复制构造函数,在该内存中构造一个对象。
类似地,当像delete pt;这样删除一个QueueItem指针的时候,运行QueueItem析构函数清除pt指向的对象,并调用该类的operator delete,将元素所用的内存放回自由列表。
4. 定义operator new
template
void *CachedObj
if(sz!=sizeof(T))
throw std::runtime_error("CachedObj:wrong size object in operator new");
if(!freestore){
T *arr=alloc_mem.allocate(chunk);
for(size_t i=0;i!=chunk;++i)
add_to_freelist(&arr[i]);
}
T *p=freestore;
freestore=freestore->CachedObj
return p;
}
template
void *CachedObj
if(sz!=sizeof(T))
throw std::runtime_error("CachedObj:wrong size object in operator new");
if(!freestore){
T *arr=alloc_mem.allocate(chunk);
for(size_t i=0;i!=chunk;++i)
add_to_freelist(&arr[i]);
}
T *p=freestore;
freestore=freestore->CachedObj
return p;
}5. 定义operator delete
operator delete成员只负责管理内存,在析构函数中已经清楚了对象本身,delete表达式在调用operator delete之前调用析构函数。它调用add_to_freelist成员将被删除对象放回自由列表。
template
void CachedObj
if(p!=0)
add_to_freelist(static_cast
}
template
void CachedObj
if(p!=0)
add_to_freelist(static_cast
}6. add_to_freelist成员
template
void CachedObj
p->CachedObj
freestore=p;
}
template
void CachedObj
p->CachedObj
freestore=p;
}为了避免任何与派生类中定义的成员可能的冲突,显式指定我们正在给基类成员next赋值。
7. 定义静态数据成员
template
std::allocator
template
T *CachedObj
template
const std::size_t CachedObj
摘自 xufei96的专栏