看过《effective c++》的人请进,有一小问题

liguang1981 2003-12-09 12:13:22
在内存管理这章中 作者提出了一个内存池的概念 并在一个plane 类中实现了类自己的new 和delete 但对内存池的最后释放问题却没给代码,我不理解怎样用::operator delete来释放 ,请高手指教,最好给出代码

...全文
60 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
dddd8888 2004-01-30
  • 打赏
  • 举报
回复
getnext()的定义能不能贴出来
smaxll 2003-12-09
  • 打赏
  • 举报
回复
search
hanyixin 2003-12-09
  • 打赏
  • 举报
回复

一开始怎么申请的,最后就怎么释放,就是这个道理 ^_^
hanyixin 2003-12-09
  • 打赏
  • 举报
回复

你传递给delete的值就是你new返回的值吗?

还有:
Node *new_block=static_cast<Node *>(::operator new(sizeof(Node)*512));
~~~~~~~~~~~~~~~~~~~~~~~~~~
这样也可以?
liguang1981 2003-12-09
  • 打赏
  • 举报
回复
我也试了
List::~List()
{
if(_head)
{
del();
}
::operator delete (Node::free_head);//free_head 为内存池的头指针
}

但在::operator delete (Node::free_head);还有异常_BLOCK_TYPE_IS_VALID

hanyixin 2003-12-09
  • 打赏
  • 举报
回复

你用了一个new申请了一大块空间,删除的时候就应该只用一个delete来释放才对。

liguang1981 2003-12-09
  • 打赏
  • 举报
回复

Node是一个类
class Node
{ private:
Node *next;
}

我先用::operator new() 分配了sizeof(Node)*512一大块内存区
Node *new_block=static_cast<Node *>(::operator new(sizeof(Node)*512));
//然后分成一块块,每一块的大小为sizeof(Node)
并把每块都串起来
for(int i=0;i<512-1;i++)
{
new_block[i]._next = &new_block[i+1];

}
new_block[512-1]._next = 0;
free_head=&new_block[0];
//free_head 为这段内存的头指针
//当外部程序要内存的话,就从这内存池里取一块或几块下来

我要释放这段内存
但::operator delete() 好像只能是删void的连续内存,是吗?
我编了一个释放函数 用一个指针遍历这段内存串,用::operator delete 一块块删除
Node *prev =Node::free_head;
Node *p= prev->getnext();
while(p!=0)
{
::operator delete (prev);
prev=p;
p=p->getnext();
}
::operator delete (prev);
但不成功
因该怎么删?




24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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