请教关于c++内存管理的一个问题
我近日在看《effective c++》,看到内存管理中作者讲到内存池
于是我便实现了一链表类
class Node//一个节点类被list包含
{
public:
Node(int nu,string &na,double score,Node *ne=0);
Node(Node *&t);
void *operator new(size_t size);
void operator delete(void *p,size_t size);
~Node()
{
_name.~string();
_next=0;
}
Node *& getnext()
{
return _next;
}
static Node *getFree_head()
{
return free_head;
}
private:
int _num;
string _name;
double _score;
Node * _next;
static int NodeNumber;
static Node *free_head;//内存池的头指针
static const int BLOCK_NUM;//内存块数
};
class List
{
public:
List()
{
_head=_back=0;
}
~List();
private:
Node *_head;
Node *_back;
void init(List &s);
};
其中按作者说
void * Node::operator new(size_t size)
{
if(size!=sizeof(Node))
return ::operator new(size);
Node *p=free_head;
if(p)
{
free_head = p->_next;
}
else
{
Node *new_block=static_cast<Node *>(::operator new(size*BLOCK_NUM));
//分配size*BLOCK_NUM的一整块内存
for(int i=1;i<BLOCK_NUM-1;i++)
{
new_block[i]._next=&new_block[i+1];
}
//巴内存串成一个freelist
new_block[BLOCK_NUM-1]._next = 0;
p=new_block;
free_head=&new_block[1];
}
return p;
}
void Node::operator delete(void *deadObject,size_t size)
{
if(size!=sizeof(Node))
{
::operator delete(deadObject);
return;
}
if(deadObject==0)
return ;
}
Node *freeNode = static_cast<Node *> (deadObject);
freeNode->_next = free_head;
free_head =freeNode; //把不用的内存块串回freelist
}
以下是我编的释放freelist的函数
List::~List()
{
if(_head)
{
del();
}
Node *prev = Node::free_head;
Node *p = prev->getnext();
while(p!=0)
{
::operator delete (prev);//在这步总有异常
prev=p;
p=p->getnext();
}
::operator delete (prev);
}
释放函数是这样编吗?请赐教?应该怎么释放内存池