内存分配访问无效:内存分配管理的代码 用C实现

主要是解决自己分配内存忘记释放问题自己定义了几个取代了malloc,calloc,realloc,free这几个尽量跟原有使用方法

头文件mypool.h

#ndef _MYPOOL_H
# _MYPOOL_H

struct Node
{
struct Node *preNode;//前个节点
struct Node *nextNode;//后个节点
void **varAddr;//存储指针变量地址
size;
char freed;
};

struct Chain
{
struct Node *first;
struct Node *last;
size;
};
void InitChain;
struct Node* InitNode(struct Node *pn);
Push(struct Node *pn);
RemoveChain(void **id);
FreeChain;


void* MyMalloc(void **p, size);
void* MyCalloc(void **p, nsize, usize);
void* MyRealloc(void **p, size);
void MyFree(void **p);
#end

实现代码:mypool.c

/************************************************************************/

/*这些代码主要是实现对自己分配内存管理主要是为了防止在关闭后还有忘记释放内存;*/

/*这块代码并不涉及对内存区块分配管理*/

/* 作者:jackyvan ,Email:[email protected] */

/************************************************************************/

# <stdio.h>
# <stdlib.h>
# <.h>
# "mypool.h"

struct Chain chain;//定义个链表静态变量



/*化链表*/
void InitChain
{
chain.first=NULL;
chain.last=NULL;
chain.size=0;
}
/*个链表上节点*/
struct Node* InitNode(struct Node *pn)
{
pn=malloc((struct Node));
(pnNULL)
NULL;
pn->preNode=NULL;
pn->nextNode=NULL;
pn->freed=0;
pn->varAddr=0;
pn->size=0;
pn;
}
/*加入个新内存分配节点*/
Push(struct Node *pn)
{
struct Node *last=chain.last;
struct Node *first=chain.first;
(firstNULL)
{
chain.first=pn;
chain.last=pn;
}

{
chain.last->nextNode=pn;
pn->preNode=chain.last;
chain.last=pn;
}
chain.size;
1;
}
/*
从链表中移除个节点
*/
RemoveChain(void **id)
{
struct Node *first=chain.first;
struct Node *tp1=NULL,*tp2=NULL;
(firstNULL)
0;
while(first)
{

((long)first->varAddr(long)id)
{
tp1=first->preNode;
tp2=first->nextNode;
(tp1)
{
(tp2)
{
tp1->nextNode=tp2;
tp2->preNode=tp1;
}

{
tp1->nextNode=NULL;
chain.last=tp1;
}
}

{
tp2->preNode=NULL;
chain.first=tp2;
}
free(first);
chain.size--;
;
}
first=first->nextNode;
}
1;
}
/*清空链表*/
FreeChain
{
struct Node *first=chain.first;
struct Node *tp1=NULL;
while(first)
{
tp1=first->nextNode;
free((void *)*(first->varAddr));
free(first);
first=tp1;
}
chain.first=NULL;
chain.last=NULL;
chain.size=0;
1;
}
/*
自定义malloc,calloc,realloc,free
void **p参数 是存储分配内存地址变量地址根据这个地址和分配内存关联进行管理
*/
void* MyMalloc(void **p, size)
{
struct Node *pn=NULL;
(*p)=malloc(size);
(pNULL)
NULL;
pn=InitNode(pn);
(pnNULL)
NULL;
pn->varAddr=p;
pn->size=size;
Push(pn);
(*p);
}
void* MyCalloc(void **p, nsize, usize)
{
struct Node *pn=NULL;
(*p)=calloc(nsize,usize);
(pNULL)
NULL;
pn=InitNode(pn);
(pnNULL)
NULL;
pn->varAddr=p;
pn->size=nsize*usize;
Push(pn);
(*p);
}
void* MyRealloc(void **p, size)
{
struct Node *pn=NULL;
(*p)=realloc((*p),size);
(pNULL)
NULL;
pn=InitNode(pn);
(pnNULL)
NULL;
pn->varAddr=p;
pn->size=size;
RemoveChain(p);
Push(pn);
(*p);
}

void MyFree(void **p)
{
((*p)NULL)
;
free((*p));//释放内存
RemoveChain(p);//把相关节点从链表移除
}



{
char *p=NULL;
char *p2=NULL;
*p3=NULL;
InitChain;
p=MyCalloc(&p,100,(char));
strcpy(p,"abcdefgh...");
p2=MyMalloc(&p2,18*(char));
p3=MyMalloc(&p3,10*());
p3=MyRealloc(&p3,20*());
MyFree(&p2);
FreeChain;
0;
}
Tags:  如何分配虚拟内存 内存错误代码 内存分配 内存分配访问无效

延伸阅读

最新评论

发表评论