请教关于c++内存管理的一个问题

liguang1981 2003-12-08 04:25:55
我近日在看《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);
}

释放函数是这样编吗?请赐教?应该怎么释放内存池
...全文
55 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
seanpeng 2003-12-09
  • 打赏
  • 举报
回复
你的
if(_head)
{
del();
}
是什么意思?

::operator delete (prev);//在这步总有异常
这一步已将prev结点删除,那么下一句又从何而来?
yjh1982 2003-12-09
  • 打赏
  • 举报
回复
好象连续删了三次:)
yjh1982 2003-12-09
  • 打赏
  • 举报
回复
List::~List()
{
if(_head)
{
del();//1
}

Node *prev = Node::free_head;
Node *p = prev->getnext();
while(p!=0)
{
::operator delete (prev);//2//在这步总有异常
prev=p;
p=p->getnext();
}
::operator delete (prev);//3
}
liguang1981 2003-12-09
  • 打赏
  • 举报
回复
to:seanpeng(乔扬) ( ) 信誉:100 2003-12-09 00:09:00 得分:0
谢谢你的回复!

p和prev都是指针 prev指向p的前一个节点,::operator delete (prev),后使把prev=p;
p再向下走
有错吗?

to:yjh1982(血精灵)
谢谢你的回复!
哪边删了三次啊?

liguang1981 2003-12-09
  • 打赏
  • 举报
回复
_head是一个连表的头指针 Node是个节点类 被list 链表类包含,
我先建了一大块备用内存,这块内存市为Node量身定做的 sizeof(Node)*512
当list类要建一个节点时,就从这块内存中取一块下来接到前一个节点后面
if(_head)
{
del();
}
适当这个连表对象被拆构时 把这些节点块返还给这块备用内存池
我想问镇么删除这块备用内存?
我是用一指针遍历这块内存,按Node的大小一块块删的
行吗?
::operator delete (prev);//在这步总有异常,运行不下去
liguang1981 2003-12-08
  • 打赏
  • 举报
回复
请大家帮帮忙嘛 怎么没人说话

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧