可利用空间表(freelist)其实是一种栈stack的结构。它的原理就是重载链表类的new和delete运算符,使得分配空间变得更为智能。具体过程如下:
freelist是结点node类的static成员(说明它是共享于所有链表的)其中全都是空的指针以栈的形式存放,当构造对象的时候,调用重载的new运算符,即使用freelist中的闲余指针。而当删除对象时,调用delete运算符,然而该对象所对应的的指针并不会被真正删除,而是放到freelist中以便下次使用。
这一次我会把可用空间表写到成员函数中,再在双链表的实现中调用。
注意:由于我们写的是链表类,不知道实际返回指针的类型,所以new和delete重载的返回类型都应该写void。
首先是node类实现的代码段:
template <typename E> class node{
private:
static node<E>*freelist; //reference to fresslist head
public:
E element;
node *prev;
node *next; //dl list's attribute--two pointers
//constructor:
node (const E&it, node* prevp, node* nextp){
element = it;
prev = prevp;
next = nextp;
}
node (node* prevp = NULL, node* nextp = NULL){
prev = prevp; next = nextp;
}
//destructor:
~node(){
}
void *operator new(size_t){
if(freelist==NULL) return ::new node;//here ::new means the original new method
node<E> *temp =