#include <stdlib.h>#include<stdio.h>//the number of requests and releases used to count memory matchesStatic int_g =0;void*_pbcm_malloc (size_t sz) {++_g; return malloc(SZ);}void_pbcm_free (void*p) {if(p) {--_g; Free(P); }}void* _PBCM_REALLOC (void*p, size_t sz) { return realloc(P,SZ);}void_pbcm_memory () {printf ("%d\n", _g); }//linked list node for recording the first address of each piece of memorystructHeap_page {structHeap_page *next;};//The entry of the entire list, attaching the dimension information of the first Heap_page node, and subsequent nodes are not loggedstructHeap {structHeap_page *Current ; intsize; intused;};structHeap *_pbch_new (intpagesize) { intCap =1024x768; //ensure cap is greater than pagesize and is a multiple of 1024 while(Cap <pagesize) {Cap*=2; } //The dimensions in the heap structure record the Heap_page node that current points to structHeap * H = (structHeap *) _pbcm_malloc (sizeof(structheap)); //here this memory request size sizeof (struct heap_page) + cap//The requested memory size is cap, but you need to append the list node to the head of the memory block that is sizeof (struct heap_page), so you can use Heap_page to string up each piece of memory//That is, each memory block is added to the head using the struct Heap_page structure in seriesH->current = (structHeap_page *) _pbcm_malloc (sizeof(structHeap_page) +cap); H->size =cap; H->used =0; H->current->next =NULL; returnh;}void_pbch_delete (structHeap *h) {//Traverse Heap_page, delete all structHeap_page * p = h->Current ; structHeap_page * Next = p->Next; for(;;) {_pbcm_free (P); if(Next = =NULL) Break; P=Next; Next= p->Next; } _pbcm_free (h);}void*_pbch_alloc (structHeap *h,intsize) { //the size obtained is greater than the incoming size and is a multiple of 4Size = (size +3) & ~3; //determine if the heap_page that the heap->current points to has enough memory space if(H->size-h->used <size) { structHeap_page *p; //Heap->size is the default size of each block of memory, if you can still request a heap->size size memory block if(Size < H->size) {P= (structHeap_page *) _pbcm_malloc (sizeof(structHeap_page) + h->size); } Else{p= (structHeap_page *) _pbcm_malloc (sizeof(structHeap_page) +size); } //inserting a newly created block of memory directly into the linked header, the heap also records only the newly created memory block, the original memory block is concatenated with the linked list, and can only wait for subsequent memory releasesP->next = h->Current ; H->current =p; H->used =size; //(p+1) is to point to real memory, not the heap_page structure of each memory head, P+1 is to move a heap_page space return(p+1); } Else { //return memory block unused part//(char *) (h->current + 1) is meant to point to true memory, not the heap_page structure of each memory header Char* Buffer = (Char*) (H->current +1); Buffer+ = H->used; H->used + =size; returnbuffer; }}
Cloud Wind PBC Source ALLOC.C