⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ymem.c

📁 guide and some example with visualC++
💻 C
字号:
/* ymem.c * *	(C) Copyright Apr 15 1995, Edmond J. Breen. *		   ALL RIGHTS RESERVED. * This code may be copied for personal, non-profit use only. * */#include <stdio.h>#include <stdlib.h>#include <string.h>#include "xalloc.h"#include "assertp.h"#include "global.h"char XGMARK = 0;#define freemark -1/*CUT XALLOC_struct*/typedef struct {    size_t nbytes;        /*sizeof allocated area*/    void * p;             /*pointer to allocated area*/    char mark;            /*memory mark: used by garbage collector*/    char * crt_file;      /*Name of file which asked to creat the memory*/    int crt_lineno;       /*Line no from which the creation call was made*/    unsigned long alloc_num;        /*allocation entry number*/}XALLOC;/*END CUT*/typedef struct {    int dbuf_no;    int top;    XALLOC *dbuf;}memtab_t;#define  MTABSZ  203memtab_t MTAB[MTABSZ];#define  BNO(p) ((unsigned long)p % MTABSZ)  #define  BUFINC  10#define STDMSG ("line %d in file %s: "\		"tot_seen  %lu\n",lineno,file,(unsigned long)tot_seen);/*CUT XALLOC_array*/unsigned long EiC_tot_memory = 0L;  /*total amount of memory allocated in bytes*/size_t  EiC_tot_alloc  = 0;         /*total number of current memory allocations*/size_t  tot_seen = 0;           /*total number of allocations made *//*END CUT*/int EiC_getMemMark(unsigned long item){    /* given an item number, return its mark value */    size_t i,k;    for(k=0;k<MTABSZ;k++)	for(i=0;i<MTAB[k].dbuf_no;++i)	    if(MTAB[k].dbuf[i].alloc_num == item)		return MTAB[k].dbuf[i].mark;    return -1;}void EiC_freeMemItem(unsigned long item){    size_t i,k;    for(k=0;k<MTABSZ;k++)	for(i=0;i<MTAB[k].dbuf_no;++i)	    if(MTAB[k].dbuf[i].alloc_num == item) {		xfree(MTAB[k].dbuf[i].p);		return ;	    }}void EiC_ydumpnonmark(char *outfile, char mark){    size_t i,k;    for(k=0;k<MTABSZ;k++) 	for(i=0;i<MTAB[k].dbuf_no;++i)	    if(MTAB[k].dbuf[i].mark >= 0) {		if(MTAB[k].dbuf[i].mark != mark)   {		    printf("item %ld Create line %d file %s nbytes %lu\n",			   MTAB[k].dbuf[i].alloc_num,			   MTAB[k].dbuf[i].crt_lineno,			   MTAB[k].dbuf[i].crt_file,			   (unsigned long)MTAB[k].dbuf[i].nbytes);		    MTAB[k].dbuf[i].mark = MEM_LEAK;		} else		    MTAB[k].dbuf[i].mark = 0;	    }}size_t EiC_xalloc_NextEntryNum(void){    return tot_seen + 1;}void EiC_xalloc_CleanUp(size_t bot, size_t top){    size_t i,k;    for(k=0;k<MTABSZ;k++)	for(i=0;i<MTAB[k].dbuf_no;++i)	    if(MTAB[k].dbuf[i].p)		if(MTAB[k].dbuf[i].alloc_num >= bot && 		   MTAB[k].dbuf[i].alloc_num < top  &&		   MTAB[k].dbuf[i].mark != eicstay)		    xfree(MTAB[k].dbuf[i].p);}void EiC_xfreemark(char mark){    size_t i,k;    for(k=0;k<MTABSZ;k++)	for(i=0;i<MTAB[k].dbuf_no;++i)	    if(MTAB[k].dbuf[i].mark == mark)		xfree(MTAB[k].dbuf[i].p);}int EiC_ymark(char *file,	  int lineno, void *p, char mark){    int found;    found = xlookup(p);    assertp(found < 0,STDMSG);    MTAB[BNO(p)].dbuf[found].mark = mark;    return 1;}static int install(char *file,		   int lineno,		   void *p,		   size_t nbytes){    int bno;    unsigned i;    extern int EiC_memtraceON;    bno = BNO(p);        for(i=0;i<MTAB[bno].dbuf_no;++i) {  /* search for empty slot */	if(MTAB[bno].dbuf[i].p == NULL)	    break;    }        if(i >= MTAB[bno].top) {	MTAB[bno].top += BUFINC;	if(!MTAB[bno].dbuf)	    MTAB[bno].dbuf = (XALLOC*)(calloc)(sizeof(XALLOC),BUFINC + 1);	else	    MTAB[bno].dbuf = (XALLOC*)realloc(MTAB[bno].dbuf,				   sizeof(XALLOC) * (MTAB[bno].top+1));    }        assertp(MTAB[bno].dbuf == NULL,("Out of Memory"));        MTAB[bno].dbuf[i].p = p;    MTAB[bno].dbuf[i].nbytes = nbytes;    MTAB[bno].dbuf[i].mark = XGMARK;    MTAB[bno].dbuf[i].crt_file = file;    MTAB[bno].dbuf[i].crt_lineno = lineno;    EiC_tot_memory += nbytes;    EiC_tot_alloc++;    if(i>=MTAB[bno].dbuf_no)	MTAB[bno].dbuf_no++;        MTAB[bno].dbuf[i].alloc_num = ++tot_seen;    if(EiC_memtraceON)	printf("%lu ",(unsigned long)tot_seen);    return i;}int xlookup(void *p){    unsigned i,bno = BNO(p);        for(i=0; i< MTAB[bno].dbuf_no;i++)	if(MTAB[bno].dbuf[i].mark >= 0) {	    if(MTAB[bno].dbuf[i].p == p)		return i;	}    return -1;}void * EiC_ymalloc(char *file, int lineno, size_t nbytes){    void * pheap;    pheap = (malloc)(nbytes);    assertp(pheap==NULL,STDMSG);    install(file,lineno,pheap,nbytes);    return pheap;}	void * EiC_ycalloc(char *file,	       int lineno,	       size_t nelems,	       size_t elems){    void * pheap;    pheap = EiC_ymalloc(file, lineno,nelems * elems);    if(pheap)	memset(pheap,0,nelems * elems);    return pheap;}void * EiC_yrealloc(char *file, int lineno, void *oldp, size_t nbytes){    void *newp;    int found, d;        if(oldp != NULL) {	found =  xlookup(oldp);	assertp(found < 0,STDMSG);    }        newp = realloc(oldp,nbytes);        assertp(nbytes && newp == NULL,("line %d in file %s\n",lineno,file));        if(oldp) {	int bno = BNO(oldp);	d = nbytes - MTAB[bno].dbuf[found].nbytes;	if(bno != BNO(newp)) {	    int i;	    	    MTAB[bno].dbuf[found].p = NULL;	    MTAB[bno].dbuf[found].mark = freemark;	    i = install(file,lineno,newp,nbytes);	    /* retain creation time stamp */	    MTAB[BNO(newp)].dbuf[i].alloc_num	    	    = MTAB[bno].dbuf[found].alloc_num;	} else {	    MTAB[bno].dbuf[found].p = newp;	    MTAB[bno].dbuf[found].nbytes = nbytes;	    MTAB[bno].dbuf[found].crt_file = file;	    MTAB[bno].dbuf[found].crt_lineno = lineno;	}	EiC_tot_memory += d;    } else	install(file,lineno,newp,nbytes);        return newp;}void EiC_yfree(char *file, int lineno, void * p){    int found,bno = BNO(p);    found = xlookup(p);    if(found < 0) {	/*EiC_warningerror("free non-xalloc ptr: from %s line %d", file, lineno);*/	(free)(p);    } else {	EiC_tot_memory -= MTAB[bno].dbuf[found].nbytes;	EiC_tot_alloc--;	(free)(p);	MTAB[bno].dbuf[found].p = NULL;	MTAB[bno].dbuf[found].mark = freemark;    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -