- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
/*用C/C++系统提供的malloc/free函数从计算机中申请一块较大的空间备用,以下简称“存储池”。
建立存储池的管理系统,要求分别用边界标识法和伙伴系统实现。
写出自己的malloc/free/realloc函数,操作对象是存储池,与存储池管理系统完美衔接。
改写单链表与顺序表,将对系统内存的操作改为对存储池的操作。
编写主程序,证明上述功能正常。*/
#include stdio.h
#include string.h
#include stdlib.h
#include iostream
using namespace std;
#define e 16
#define F(p) (p+p-size/sizeof(WORD)-1) //跟头指针配套的根部指针
class WORD
{
public:
union
{
WORD *llink; //head指向前驱结点
WORD *uplink; //foot指向本结点头部
};
int size; //该内存块的大小
int tag; //标志0表示空闲,1表示已分配
WORD *rlink; //指向后继结点
};
WORD *b;
void m_free(void *p,WORD *pav);
WORD* AllocBoundTag(WORD* pav,int n)
{
WORD* p=pav;
for(p;p!=NULLp-rlink!=pavp-sizen;p=p-rlink);
if(p==NULL||p-sizen)
{
return NULL;
}
pav=p-rlink;
WORD *f=p+(p-size)/sizeof(WORD)-1;
if(p-size-n=e)
{
if(pav==p)
pav=NULL;
else
{
pav-llink=p-llink;
p-llink-rlink=pav;
}
p-tag=1;f-tag=1;
}
else
{
f-tag=1;
p-size-=n;
f=p+(p-size)/sizeof(WORD)-1;
f-uplink=p;
f-tag=0;
p=f+1;
p-tag=1;
p-size=n;
}
return p;
}
void *m_malloc(WORD* pav,int n)
{
n=n/sizeof(WORD)*sizeof(WORD)+sizeof(WORD);
WORD* temp=AllocBoundTag(pav,n);
return (void*)temp;
}
void *m_realloc(void * x,WORD* pav,int n)
{
WORD *temp=(WORD*)x;
if((F(temp)+1)-tag==0((F(temp)+1)-size+temp-size)=n)
{
n=n/sizeof(WORD)*sizeof(WORD)+sizeof(WORD);
WORD* yy=F(temp)+1;
WORD *yyl=yy-llink;
WORD *yyr=yy-rlink;
int yys=yy-size;
int tes=temp-size;
temp-size=n;
F(temp)-uplink=temp;
F(temp)-tag=1;
yy=F(temp)+1;
yyl-rlink=yy;
yy-llink=yyl;
yyr-llink=yy;
yy-rlink=yyr;
yy-tag=0;
yy-size=yys+tes-n;
F(yy)-size=yy-size;
F(yy)-uplink=yy;
}
else
{
m_free(temp,pav);
temp=(WORD*)m_malloc(pav,n);
}
void * zz=(void*)temp;
return zz;
}
void m_free(void *p,WORD *pav)
{
if(p==NULL)
return ;
WORD *temp=(WORD*)p;
int a=0,b=0,c=0;
if((temp-1)-tag==0)
a=1;
if((temp+temp-size/sizeof(WORD))-tag==0)
b=2;
c=a+b;
if(c==1)
{
cout左邻空endl;
(temp-1)-uplink-size+=temp-size;
文档评论(0)