声明部分 头文件mem.h
#include <stdio.h>
#include <stdlib.h>
//用于对所有C项目的内存的有效管理
void *mymalloc(size_t size);
void myfree(void *p);
void *myrealloc(void*p, size_t size);
struct MEM
{
void *p;
int size;
};
typedef struct LinkNode
{
struct MEM *pmem;//保存内存指针
struct LinkNode *pNext;//指向下一个节点
}node ,*PNODE;
struct LinkNode *phead;
PNODE addback(PNODE phead, struct MEM *pmem);//插入一个数据
PNODE change(PNODE phead, void *pfind, struct MEM *pnewmem);//修改
PNODE findit(PNODE phead, void *pfind);
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);
struct MEM *pmem = malloc(sizeof(struct MEM));
pmem->p = p;
pmem->size = size;//开辟一个结点
phead = addback(phead, pmem);
return p;
}
void myfree(void *p)
{
PNODE *px = findit(phead, p);
if (NULL==px )
{
return;
}
else
{
deletenode(phead, p);
free(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;
}
PNODE addback(PNODE phead, struct MEM *pmem)//插入一个数据
{
PNODE pnew = malloc(sizeof(node));
pnew->pmem = 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->pmem->p==pfind)
{
p->pmem->p = pnewmem->p;
p->pmem->size = pnewmem->size;
return phead;
}
}
return phead;
}
PNODE findit(PNODE phead, void *pfind)
{
for (PNODE p = phead; p != NULL; p = p->pNext)
{
if (p->pmem->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->pmem->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->pmem->p, phead->pmem->size);
showall(phead->pNext);//遍历
}
}
void getinfo(PNODE phead)
{
printf("\n");
int i = 0;//多少个地址
int j = 0;//代表多少个字节内存
for (PNODE p = phead; p != NULL; p = p->pNext)
{
i++;
j += p->pmem->size;
printf("\nmemaddr=%p,size=%d", p->pmem->p, p->pmem->size);
}
printf("\n目前一共%d个地址在使用,一共消耗%d内存", i, j);
}
//清除所有内存
PNODE deleteall(PNODE phead)
{
if (NULL==phead )
{
return NULL;
}
else
{
PNODE p1 = NULL;
PNODE p2 = NULL;
p1 = phead;
while (p1->pNext!=NULL)
{
p2 = p1->pNext;
p1->pNext = p2->pNext;//跳过p1
free(p2->pmem->p);//释放p2指向的这片内存
free(p2);
}
//最后释放头结点的内存地址
free(phead->pmem->p);//释放内存
free(phead);//最后释放头结点
return NULL;
}
}
------------------------------------------
主函数测试部分 mallocfree.c
#include "mem.h"
#define malloc mymalloc
#define free myfree
#define realloc myrealloc
void main()
{
int a;
int *p;
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, 1024 * 1024 * 200);
getinfo(phead);
free(p2);
free(p2);//允许重复释放 ok
free(10003);//ok
getinfo(phead);
deleteall(phead);
system("pause");
}
更多资料 · 微信公众号搜索【CTO Plus】关注后,获取更多,我们一起学习交流。
关于公众号的描述访问如下链接