mem.h
#include<stdio.h>
#include<stdlib.h>
#include<memory.h>
struct MEM
{
void *p;
size_t size;
};
typedef struct LinkNode
{
struct MEM *mem;
struct LinkNode *pNext;
}node,*PNODE;
struct LinkNode *phead;//声明
void *mymalloc(size_t size);
void *myrealloc(void *p, size_t size);
void myfree(void *p);
PNODE findit(PNODE phead, void *pfind);
PNODE addback(PNODE phead, struct MEM *pmem);//插入一个数据
PNODE change(PNODE phead, void *pfind, struct MEM *pnewmem);//修改
PNODE deletenode(PNODE phead, void *paddr);//删除
void showall(PNODE phead);
void getinfo(PNODE phead);
PNODE deleteall(PNODE phead);
mem.c
#include"mem.h"
struct LinkNode *phead=NULL; //实现
void *mymalloc(size_t size)
{
void *p = malloc(size);
//printf("\n内存地址%p存储了%d的内存", p, size);
struct MEM *pmem = malloc(sizeof(struct MEM));
pmem->p = p;
pmem->size = size;//开辟一个节点
phead = addback(phead, pmem);
return p;
}
void *myrealloc(void *p, size_t size)
{
void *pt = realloc(p, size);
struct MEM mymem;
mymem.p = pt;
mymem.size = size;//新的内存地址大小
phead = change(phead, p, &mymem);
return pt;
}
void myfree(void *p)
{
PNODE *px=findit(phead, p);
if (px==NULL)
{
return;
}
else
{
deletenode(phead, p); //删除
free(p);
}
}
PNODE addback(PNODE phead, struct MEM *pmem)//插入一个数据
{
PNODE pnew = malloc(sizeof(node));
pnew->mem = pmem;
pnew->pNext = NULL;//开辟一个节点
if (phead==NULL)
{
phead = pnew;
}
else
{
PNODE ptemp = phead;
while (ptemp->pNext!=NULL)
{
ptemp = ptemp->pNext;
}
ptemp->pNext = pnew;
}
return phead;
}
PNODE change(PNODE phead, void *pfind, struct MEM *pnewmem)//修改
{
for (PNODE p = phead; p !=NULL; p=p->pNext)
{
if (p->mem->p == pfind)
{
p->mem->p = pnewmem->p;
p->mem->size = pnewmem->size;
return phead;
}
}
return phead;
}
PNODE findit(PNODE phead, void *pfind)
{
for (PNODE p=phead;p!=NULL;p=p->pNext)
{
if (p->mem->p==pfind)
{
return p;
}
}
return NULL;
}
PNODE deletenode(PNODE phead, void *paddr)//删除
{
PNODE p1, p2;
p1 = p2 = NULL;
p1 = phead;
while (p1!=NULL)
{
if (p1->mem->p == paddr)
{
break;
}
else
{
p2 = p1;
p1 = p1->pNext;//备份上一个地址
}
}
if (p1!=phead)
{
p2->pNext = p1->pNext;
free(p1);
}
else
{
phead = phead->pNext;
free(p1);
}
return phead;
}
void showall(PNODE phead)
{
if (phead==NULL)
{
return;
}
else
{
printf("\nmemaddr=%p,size=%d", phead->mem->p, phead->mem->size);
showall(phead->pNext);//遍历
}
}
void getinfo(PNODE phead)
{
printf("\n\n\n");
int i = 0;//多少个地址
int j = 0;//代表多少个字节内存
for (PNODE p=phead;p!=NULL;p=p->pNext)
{
i++;
j += p->mem->size;
printf("\nmemaddr=%p,size=%d", p->mem->p, p->mem->size);
}
printf("\n目前一共%d个地址在使用,一共消耗%d内存",i,j);
}
PNODE deleteall(PNODE phead)
{
if (phead==NULL)
{
return NULL;
}
else
{
PNODE p1 = NULL;
PNODE p2 = NULL;
p1 = phead;
while (p1->pNext!=NULL)
{
p2 = p1->pNext;
p1->pNext = p2->pNext;
free(p2->mem->p);
free(p2);
}
free(phead->mem->p);
free(phead);//最后释放最后一个元素
}
}
main.c
#include"mem.h"
#define malloc mymalloc
#define realloc myrealloc
#define free myfree
void main()
{
void *p1 = malloc(1024 * 1024 * 100);
void *p2 = malloc(1024 * 1024 * 100);
void *p3 = malloc(1024 * 1024 * 100);
void *p4 = malloc(1024 * 1024 * 100);
getinfo(phead);
realloc(p1, 200);
printf("\n\n\n");
getinfo(phead);
free(p2);
printf("\n\n\n");
getinfo(phead);
deleteall(phead);
system("pause");
}