C语言利用链表实现有效内存管理


#include
#include

//记录分配的内存地址大小、地址
struct MEM {
	void *p;
	int size;
};

typedef struct LinkNode {
	struct MEM *pmem;//保存指针
	struct LinkNode *pNext;//指向下一个节点
} node,*PNODE;

PNODE phead;

PNODE findit(PNODE phead,void *paddr) {
	for(PNODE p=phead; p!=NULL; p=p->pNext) {
		if(p->pmem->p==paddr) {
			return p;
		}
	}
	return NULL;
}

//删除
PNODE deletenode(PNODE phead,void *paddr) {
	PNODE p1=NULL;
	PNODE p2=NULL;
	p1=phead;
//	if(phead==paddr){//如果要删除的刚好是头结点
//		phead=p1->pNext;
//		free(p1);
//		return phead;
//	}
//	while(p1!=paddr){
//		p2=p1;
//		p1=p1->pNext;
//	}
//	p2->pNext=p1->pNext;
//	free(p1);
	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 myfree(void *p) {
//	printf("\n内存地址%p释放\n",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=(PNODE)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;
}

void *mymalloc(size_t size) {
	void *p=malloc(size);
//	printf("\n分配内存地址%p,大小%d\n",p,size);

	struct MEM *pmem=(struct MEM *)malloc(sizeof(struct MEM));
	pmem->p=p;
	pmem->size=size;
	phead=addback(phead,pmem);

	return p;
}

//修改
PNODE change(PNODE phead,void *pfind,struct MEM *pnewmem) {
//	PNODE pt=phead;
//	while(pt->pmem->p!=pfind&&pt!=NULL){
//		pt=pt->pNext;
//	}
	pnewmem->p=realloc(pt,pnewmem->size);
//    pt->pmem->p=pnewmem->p;
//    pt->pmem->size=pnewmem->size;
	for(PNODE p=phead; p!=NULL; p=p->pNext) {
		if(p->pmem->p==pfind) {
			p->pmem->p=pnewmem;
			p->pmem->size=pnewmem->size;
		}
	}
	return phead;
}

void *myrealloc(void *p,size_t size) {
	void *pt=realloc(p,size);
//	printf("内存地址%p重新分配到%p,大小%d\n",p,pt,size);
	//重新完成赋值
	struct MEM mymem;
	mymem.p=pt;
	mymem.size=size;
	phead=change(phead,p,&mymem);

	return pt;
}

//显示所有数据
void showall(PNODE phead) {
	if(phead==NULL) {
		return;
	} else {
//		PNODE p=phead;
//	    while(p!=NULL){
//		  printf("内存地址%p,大小%d",(p->pmem)->p,(p->pmem)->size);
//	    }
		printf("内存地址%p,大小%d\n",(phead->pmem)->p,(phead->pmem)->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->pmem->size;
		printf("memaddr=%p,size=%d\n",p->pmem->p,p->pmem->size);
	}
	printf("目前一共%d个地址在使用,一共消耗%d内存\n",i,j);
}
//释放所有内存(双链表)
void deleteall(PNODE phead) {
	if(phead==NULL) {
		return NULL;
	} else {
		PNODE p1=NULL;
		PNODE p2=NULL;
		p1=phead;
		while(p1->pNext!=NULL){
//			p2=p1;
//			p1=p1->pNext;
//			phead=p1;

			//保留头结点,依次往后删除 
			p2=p1->pNext;
			p1->pNext=p2->pNext;
			free(p2->pmem->p);//释放内存 
			free(p2);
		}
//		free(p1);
		free(phead->pmem->p); 
		free(phead); 
	}
}

#define malloc mymalloc
#define free myfree
#define realloc myrealloc

main() {
	void *p1=malloc(10);
	void *p2=malloc(11);
	void *p3=malloc(12);
	void *p4=malloc(13);

//	showall(phead);
	getinfo(phead);
//	free(p1);
//	realloc(p2,100);

	free(p2);
	free(p2);
//	printf("\n\n");
//	showall(phead);
	getinfo(phead);

	free((void*)789320);
//	printf("\n\n");
//	showall(phead);
	getinfo(phead);
}


你可能感兴趣的:(C)