malloc和内存泄漏 [英] malloc and memory leaks

查看:95
本文介绍了malloc和内存泄漏的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是函数malloc_m(),应该像malloc(),但是它需要找到内存泄漏,并且在数组中过度写入。


你看到多少错误?

谢谢

************************ ********************

/ * mallocm.c * /

/ * funzione di libreria per trattamento della memoria e rilevamento

errori * /

/ * uso:c_compiler malloc.ce usare malloc .obj * /

/ *

Declino ogni responsabilita''per qualsiasi danno

che potrebbe arrecare questo programma e ogni

garanzia che serva a qualche cosa; Il programma si

意大利自由(免费)每l''uso e per il

cambiamento。


* /

#include< stdio.h>

#include< stdlib.h>

#include< time.h>


/ * MEM_LIMIT e''il limite del numero di diversi puntatori

ritornati da malloc_m * /

#define MEM_LIMIT 100000

#define MAX_ARRAYS 255

#define UNS unsigned


/ ***************** ******** CCCCCCC ****************** **************** /

#ifdef __cplusplus

extern" C" {

#endif


静态无符号yuyuy = 0;

typedef double Align; / * perineare alla double * /


union header {/ * header del blocco * /

struct {union header * ptr; / * blocco successivo在免费列表中* /

无符号大小; / * dimensione di questo blocco * /

} s;

对齐x; / * forza l''allineamento dei blocchi * /

};


typedef union header Header;

static Header base; / * lista vuota per iniziare * /

static Header * freep = NULL; / * inizio della免费清单* /


char name_ [1100] = {0}; / * name _ == nome例程chiamate

* /

char memo_ [300] = {0}; / * stringa ove errori trovati

memoria * /

int n_i_ = 0;

int libero_m_ = 0; / * libero_m _ == 1 controllo tutti i

vettori a

ogni chiamate di free();为每个人提供名字_

例程che

sovrascrivono la memoria che non hanno(例如if(libero_m_)

init_w(" nome_routines" ;);)* /


typedef struct {

void * p;

无符号大小;

unsigned piu;

unsigned meno;

} vettore_array;


static vettore_array ** p_p_p_ = 0; / * lista di struct di puntatori

ritornati da malloc_m * /

static unsigned i_i_i_ = 0; / * attuale indice nella lista * /

static unsigned m_m_m_ = 0; / * massimo indice nella lista * /

static char ** list_ = 0; / * lista dei vettori richiesti al

sys * /

static unsigned list_i_ = 0;

static unsigned list_m_ = 0;

static int mem_init(unsigned siz)

{vettore_array ** pp;

unsigned j;

/ * ---- ----------------- * /

// printf(" p_p_p _ =%p i_i_i _ ==%u siz =%u,( void *)p_p_p_,i_i_i _,

siz);

if(p_p_p _ == 0)

{pp =(vettore_array **)malloc ((siz + 1)* sizeof * pp);

if(pp == 0)返回0;

for(j = 0; j< siz; ++ j)

{pp [j] =(vettore_array *)malloc(sizeof(vettore_array));

if(pp [j] == 0)

{if(j!= 0)

for(--j; j!= 0; --j)

free((void *)pp [j]);

free((void *)pp [0]); free((void *)pp);返回0;

}

}

}

else {if(siz == m_m_m_)返回1;

else if(siz< m_m_m_)/ * dovrebbe distruggere la

memoria eccessiva * /

{if(siz< = i_i_i_)return 1; / * la 1024ma volta che viene

chiamato free_m()* /

for(j = siz; j< m_m_m_; ++ j)// v [0]。 ..v [size] = size + 1

free((void *)p_p_p_ [j]);

pp =(vettore_array **)realloc(p_p_p_,( siz + 1)* sizeof

* pp);

if(pp == 0){printf(" Fallimento realloc\ n);; m_m_m_ =

siz;返回1;}

/ * ritorna senza cambiare niente * /

goto label;

}

pp = (vettore_array **)realloc((void *)p_p_p_,(siz + 1)*

sizeof * pp);

if(pp == 0){printf( Fallimento realloc\ n);返回0;}

if(siz> i_i_i_)

{for(j = i_i_i_; j< siz; ++ j)

{pp [j] =(vettore_array *)malloc(

sizeof(vettore_array));

if(pp [j] == 0)

{if(j!= 0)

for(--j; j!= 0; --j)

free((void *)pp [j ]);

free((void *)pp [0]);返回0;

}


}

}

}

标签:;

m_m_m_ = siz; p_p_p_ = PP;返回1;

}


/ * malloc_m:allocatore di memoria * /

void * malloc_m(unsigned nbytes)

{Header * p,* prevp;

unsigned nunits,* k,* kk,led,size;

Header * morecore(unsigned);

unsigned verifica_all_m(void);

void stato_mem(void);

/ * ------------ ------------------- * /

if(libero_m_)

{

if(verifica_all_m()== 0)

stato_mem();

}

if(i_i_i_> MEM_LIMIT || nbytes == 0)返回0;

if(i_i_i_> = m_m_m_)

{if(mem_init(i_i_i_ + MAX_ARRAYS)== 0)返回0;}

nunits = nbytes + sizeof(Header);

nunits = nunits / sizeof(Header)+((nunits%sizeof(Header)

sizeof(unsigned))?1 :0)+ 1;



if((prevp = freep)== NULL)/ * non esiste la free list * /

{base.s .ptr = freep = prevp =安培;基座; base.s.size = 0; }

for(p = prevp-> s.ptr ;; prevp = p,p = p-> s.ptr)

{if(p-> ; s.size> = nunits)/ * spazio insufficiente * /

{if(p-> s.size == nunits)/ * esattamente * /

{

prevp-> s.ptr = p-> s.ptr;

}

else / * alloca la parte finale * /

{

p-> s.size - = nunits;

p + = p-> s.size;

p-> s.size = nunits;

}

freep = prevp;

/ ****** ************ Blocco aggiunto ************ /

size = nbytes;

led =( size%sizeof(unsigned)!= 0)? 1:0;

k =(无符号*)(p + 1); KK = K; --k;

p_p_p_ [i_i_i _] - > meno = * k;

p_p_p_ [i_i_i _] - > piu = kk [size / sizeof(unsigned)+ led];

p_p_p_ [i_i_i _] - > size = size;

p_p_p_ [i_i_i _ ++] - > p =(void *)(p + 1) ;

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

return(void *)(p + 1);

}

if(p == freep )/ * la free list e''terminata * /

{++ yuyuy; / * numero delle volte di mem。

richieste al sistema * /

if((p = morecore(nunits))== NULL)

返回NULL; / * non c''e''piu''spazio * /

}

}

}


/ * Ritorna il numero degli elementi;

se il numero degli elementi e''0 ritorna(unsigned)-1

se errori ritorna 0 * /

unsigned verifica_all_m(无效)

{unsigned j,* k,* kk,xk,xkk,led;

/ * ---- ------------ * /

if(p_p_p _ == 0 || i_i_i _ == 0)返回-1;

for(j = 0; j< i_i_i_; ++ j)

{k =(unsigned *)(p_p_p_ [j] - > p); KK = K; --k;

led =(p_p_p_ [j] - > size%sizeof(unsigned)!= 0)? 1:0;

if((xk = kk [p_p_p_ [j] - > size / sizeof(unsigned)+ led])!=

(xkk = p_p_p_ [j] - > piu))

{


/ * nota bene:n:v significa NUOVO VALORE:VECCHIO VALORE * /


sprintf(memo_," verifica_all_mMEM_ + p =%5p size =%5u p [-1] =%5u

p [max] =%5u n:v = %5u:%5u",

p_p_p_ [j] - > p,p_p_p_ [j] - > size,p_p_p_ [j] - > meno,

xkk,xk,xkk);


if(n_i_> 2)name_ [n_i_ - 2] =''+'';

返回0;

}

if((xk = * k)!=(xkk = p_p_p_ [j] - > meno))

{sprintf( memo_," verifica_all_mMEM_- p =%5p size =%5u

p [-1] =%5u p [max] =%5u n:v =%5u:%5u",

p_p_p_ [j] - > p,p_p_p_ [j] - >尺寸,xkk,

p_p_p_ [j] - > piu,xk,xkk);

if(n_i_> 2)name_ [n_i_ - 2] ='' - '';

返回0;

}

}

返回i_i_i_;

}


void verifica_all(无效)

{i f(verifica_all_m()== 0)

{printf(" Errore nella memoria\\\
));

printf(" memo =%s name =% s \ n",memo_,name_);

}

}


/ * ritorna 0 se il vettore fa parte della lista

se pointer == 0 ritorna 1 se tutto e''cancellato

2 se tutto e''cancellato tranne il puntatore iniziale

3 altrimenti

* /

unsigned verifica_m(void * pointer,unsigned * jj)

{unsigned j,* k,* kk,xk ,xkk,led;

/ * ---------------- * /

if(jj!= 0)* jj = 0;

if(pointer == 0)

{if(i_i_i _ == 0&& p_p_p _ == 0)返回1;

否则if(i_i_i _ == 0)返回2;

否则返回3;

}

if(p_p_p _ == 0)返回1;

for(j = 0; j< i_i_i_; ++ j)

if(p_p_p_ [j] - > p ==指针)休息;

if(j == i_i_i_){printf(" verifica_mMEM_0%p indice =%u memo =%s

name =%s \ n",pointer,i_i_i_,memo_,name_);

if(n_i_> 2)name_ [n_i_ -2] =''0'';返回7;

}

k =(无符号*)指针; KK = K; --k;

led =(p_p_p_ [j] - > size%sizeof(unsigned)!= 0)? 1:0;

* jj = j;

if((xk = kk [p_p_p_ [j] - > size / sizeof(unsigned)+ led])! =

(xkk = p_p_p_ [j] - > piu))

{printf(" p =%p size =%up [-1] =%up [max] =%u",指针,

p_p_p_ [j] - >尺寸,* k,xk);

printf(" verifica_mMEM_ + n: v>%u:%u \ n",xk,xkk);

if(n_i_> 2)name_ [n_i_ - 2] =''+'';

返回8;

}

if((xk = * k)!=(xkk = p_p_p_ [j] - > meno))

{printf(" p =%p size =%up [-1] =%up [max] =%u",指针,

p_p_p_ [j] - > size ,xkk,p_p_p_ [j] - > piu);

printf(" verifica_mMEM_- n:v>%u:%u \ n",xk,xkk);

if(n_i_> 2)name_ [n_i_ - 2] ='' - '';

返回9;

}

否则返回0;

}


unsigned verifica_p_m(void * pointer)

{unsigned jj;

返回verifica_m(指针和& jj);

}


静态void free_list_m(void)

{while(list_i_!= 0)

{--list_i_; free(list_ [list_i_]);}

free(list_); list_ = 0; list_m_ = 0; freep = NULL;

}


static void free_vettore_m(void)

{if(p_p_p _ == 0){m_m_m_ = 0; i_i_i_ = 0;返回;}

while(i_i_i_!= 0)

{ - i_i_i_; free((void *)p_p_p_ [i_i_i_]); }

free((void *)p_p_p_);

p_p_p_ = 0; m_m_m_ = 0;

}

static void inserisci(void * ap,unsigned jk,unsigned j)

{Header * bp,* p ;

静态无符号f_cont = 0;

/ * ------------------- * /

if(jk == 0)++ f_cont;

bp =(Header *)ap - 1; / * punta all''header del blocco * /

for(p = freep;!(bp> p&& bp< p-> s.ptr); p = p- > s.ptr)

if(p> = p-> s.ptr&&(bp> p || bp< p-> s.ptr))

休息; / * il blocco liberato e''

ad un estremo della lista * /

if(jk)goto label;

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

if(j!= i_i_i_ - 1)

{

p_p_p_ [j] - > p = p_p_p_ [i_i_i_ - 1] - > p;

p_p_p_ [j] - > size = p_p_p_ [i_i_i_ - 1] - >尺寸;

p_p_p_ [j] - > meno = p_p_p_ [i_i_i_ - 1] - > meno;

p_p_p_ [j] - > piu = p_p_p_ [i_i_i_ - 1] - > piu;

}

p_p_p _ [ - -i_i_i _] - > p = 0; p_p_p_ [i_i_i _] - > size = 0;

p_p_p_ [i_i_i _] - > meno = 0; p_p_p_ [i_i_i _] - > piu = 0;

if(m_m_m_> 1000&& f_cont%1024 == 0)

mem_init(i_i_i_ + 64);

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

标签:

if(bp + bp-> s.size == p-> s.ptr)/ * lo unisce al blocco dopo * /

{bp-> s.size + = p-> s.ptr-> s.size;

bp-> s .ptr = p-> s.ptr-> s.ptr;

}

else bp-> s.ptr = p-> s.ptr ;


if(p + p-> s.size == bp)/ * lo unisce al blocco prima * /

{p-> s.size + = bp-> s.size;

p-> s.ptr = bp-> s.ptr;

}

其他p-> s.ptr = bp;


freep = p;

}


void free_all_m(void){free_vettore_m(); free_list_m();}


/ *非usare free_all_m()ma free_a_i_m se ci sono oggetti

allocati da costruttori e distruttori del c ++

(gli oggetti fuori da una qualsiasi procedura finiscono quando si

chiude

l''ultima istruzione del main)* /

void free_a_i_m(void)

{if(i_i_i _ == 0)

{free_vettore_m(); free_list_m(); printf(MEMORIA DINAMICA

LIBERATA \ n); }

}

#define NALLOC 1024 / * numero minimo di unita''richieste * /


/ * morecore:chiede al sistema memoria aggiuntiva * /

static Header * morecore(unsigned nu)

{char * cp,** p;

Header * up ;

unsigned len;

/ * ----------------------- * /

if(nu< NALLOC)nu = NALLOC;

cp =(char *)malloc(nu * sizeof(Header));

if(cp == 0)/ *非c''e''piu''spazio * /

返回NULL;


if(list_i_< = list_m_)

{len =(list_m _ == 0?128:2 * list_m_);

p =(char **)realloc(list_,len * sizeof * p);

if(p == 0)

{free(cp);返回0;}

list_ = p;

list_m_ = len;

}

list_ [list_i _ ++ ] = cp;


up =(标题*)cp;

up-> s.size = nu;

inserisci((void *)(up + 1),1,0);

返回freep;

}


/ * se指针!= 0 ritorna la size del pointer

ritorna 0 se il指针非c''e''* /

unsigned get_size_m(void * pointer)

{unsigned j;

/ * ---------------- * /

if(pointer = = 0 || p_p_p _ == 0)返回0;

for(j = 0; j< i_i_i_; ++ j)

if(p_p_p_ [j] - > p ==指针)休息;

if(j == i_i_i_)返回0;

返回p_p_p_ [j] - >尺寸;

}


void init_w(const char * nam)

{unsigned i,j;

/ * - ------------------- * /

如果(nam == 0)返回;

if(n_i_> ; 2)

name_ [n_i_ - 1] =''|'';

if(n_i_> = 1016)// 0..14 car见证15 =''|''

n_i_ = 0;

for(i = n_i_,j = 0; j< 15& amp;南[J] = 0!; ++ i,++ j)

name_ [i] = nam [j];

for(; j< 15; ++ i,++ j)

name_ [i] ='''';

name_ [i] =''#'';

n_i_ + = 16; < br $>
}


void leggi_mem(无效)

{Header * u,* v;

unsigned j;

for(u = freep; u!= 0;)

{printf(" | v =%us =%u |",(unsigned) u / sizeof(Header),u-> s.size);

if(u-> s.ptr == freep)break;

v = u- > s.ptr;

if((u + u-> s.size)!= v)

{j =(UNS)(vu) - u - > s.size;

if(j< 123456)

printf("%u",j);

else printf (#);

}

u = v;

}

}

void stato_mem(void)

{unsigned j;

leggi_mem();

fflush(stdout);

printf(\ nRAPPORTO MEMORIA DINAMICA。);

printf(Memoria richiesta al sistema =%u volte。,yuyuy );

j = verifica_all_m();

if(j!= 0&& j!= - 1)printf("%u vettori allocati con successo\\\
,j);

else {if(j == 0)goto label;

printf(" Tutto bene。);

j = verifica_m(0,0);

if(j == 1)printf(&#Sia la base sia il contatore sono NULLI\ n;;

else if(j == 2)printf(" Il contatore e''nullo ma la base no\\\
);

else {label:;

printf(" Errore nella memoria\ n);;

printf(" memo =%s name = %s \ n",memo_,name_);

free_vettore_m(); free_list_m();

退出(0);

}

}

}


void controlla_m(char * st)

{printf("!%s!",st);

fflush(stdout);

if(verifica_all_m()== 0)

{if(st)printf(" ERRORE!");

fflush(stdout );

stato_mem();

}

}

/ *免费:自由列表il blocco中的inserisce ap * /

void free_m(void * ap)

{unsigned j;

/ * ---------- --------- * /

if(ap == 0)return;

if(libero_m_)

{

if(verifica_all_m()== 0)

stato_mem();

}

if(verifica_m(ap) ,& j))

{printf(" free_m():"); stato_mem();

free_vettore_m(); free_list_m();

退出(0);

}

inserisci(ap,0,j);

}


void stampa_chiamate(void){printf(" memo =%s name =%s \ n",memo_,name_

); }


#ifdef __cplusplus

}

#endif

//罚款di extern C

/ ************************* CCCCCCC **************** ** **************** /

/ * file.c che utilizza malloc_m()

c_compiler file.c mallocm .obj * /

#include< stdio.h>

#include< stdlib.h>

#ifdef __cplusplus

externC {

#endif

void * malloc_m(unsigned nbytes);

unsigned verifica_all_m(void);

unsigned verifica_m(void * pointer,unsigned * jj);

unsigned verifica_p_m(void * pointer);


void free_m(void * ap);

void free_all_m(void);

void free_a_i_m(void);

unsigned get_size_m(void * pointer);

void stato_mem(void);

void leggi_mem(void);

void controlla_m(char * st);

void verifica_all(void);

void init_w(const char * nam);

void stampa_chiamate(void);

#ifdef __cplusplus

}

#endif


extern int libero_m_;


void g(无效)

{char * r;

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

if(libero_m_) init_w(" g()");

r = malloc_m(100 * sizeof(* r));

r [-1] =''8''; / * errore per r [-1] * /

/ * errore non liberato r * /

// free_m(r);

/ * errore se non uso free_m(r)ed stato_mem()in main mi dice

" RAPPORTO MEMORIA DINAMICA。 Memoria richiesta al sistema = 1 volte。

1 vettori allocati con successo"

significa che mi sono dimenticato di cancellare un vettore

* /

}


void f(无效)

{char * p;

int i;

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

if(libero_m_)init_w(" f() ");

p = malloc_m(100 * sizeof(* p));

for(i = 0; i< 110; ++ i)p [i] = '' 0 ''; / * errore per i> = 100 * /

free_m(p); / * se libero_m_ = 1;识别例程dell''errore * /

/ * se libero_m_ = 0; (默认)identifica un errore * /

g();

}

int main(无效)

{ // libero_m_ = 1; // scrive routines ove e''identificato l''errore

// se si identifica errore => libero_m_ = 1;"

// nel codice normale ove non si identificano errori * non * si

// deve scriverelibero_m_ = 1;"

if(libero_m_)init_w(" main");


f();


stato_mem() ; / * identifica eventuali errori emomory leaks* /

free_all_m(); / * si deve usare prima di uscire dal programma * /

stato_mem(); / * se后来

RAPPORTO MEMORIA DINAMICA。 Memoria richiesta al sistema = 1 volte。

Tutto bene。 Sia

la base sia il contatore sono NULLI"

tutto sembra ok * /

return 0;

}

解决方案

cs写道:

这是函数malloc_m(),应该像malloc()但是它应该找到内存泄漏,并且在数组中过度写入。

你看到多少错误? ...




见...

http://groups-beta.google.com/group / ... malloc + wrapper

-

彼得


In alt.lang.asm cs< n@ss.g>写道:

你看到多少错误?




0)超长文本

1)意大利语代码发布到英语新闻组

2)没有asm代码发布到asm新闻组。 ASM没有

malloc(),也不是系统调用[但是libc fn]


- Robert


在文章< t1 *************** @ newssvr12.news.prodigy.com>,

Robert Redelmeier< re **** @ ev1.net.invalid>写道:

:在alt.lang.asm cs< n@ss.g>写道:

:>您看到多少错误?


:1)意大利语代码发布到英语新闻组


哪里??


comp.lang.c和alt.lang.asm在他们的讨论中当然主要是

英语,但他们没有章程

限制讨论或变量名称或对英语的评论。


如果有人发表了一个主题或语言相对较少的b / b读者理解,那么他们就不会收到尽可能多的

反馈,否则,这不是*错误*。

它甚至不再是任何其他未定义行为(UB)发布。

最多是实施质量问题。


-

我想确保[一个用户]无法通过......一个没有点击微软广告的在线

体验

- 史蒂夫鲍尔默[微软首席执行官]

This is the function malloc_m() that should be like malloc() but it
should find memory leak, and over bound writing in arrays.

How many errors do you see?
Thank you
********************************************
/* mallocm.c */
/* funzione di libreria per trattamento della memoria e rilevamento
errori */
/* uso: c_compiler malloc.c e usare malloc .obj */
/*
Declino ogni responsabilita'' per qualsiasi danno
che potrebbe arrecare questo programma e ogni
garanzia che serva a qualche cosa; Il programma si
intende libero (free) per l''uso e per il
cambiamento.

*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

/* MEM_LIMIT e'' il limite del numero di diversi puntatori
ritornati da malloc_m */
#define MEM_LIMIT 100000
#define MAX_ARRAYS 255
#define UNS unsigned

/*************************CCCCCCC****************** ****************/
#ifdef __cplusplus
extern "C" {
#endif

static unsigned yuyuy=0;
typedef double Align; /* per allineare alla double */

union header { /* header del blocco */
struct {union header* ptr; /* blocco successivo in free list */
unsigned size; /* dimensione di questo blocco */
}s;
Align x; /* forza l''allineamento dei blocchi */
};

typedef union header Header;
static Header base; /* lista vuota per iniziare */
static Header *freep=NULL; /* inizio della free list */

char name_ [ 1100 ] = {0}; /* name_== nome routines chiamate
*/
char memo_ [ 300 ] = {0}; /* stringa ove errori trovati in
memoria */
int n_i_ = 0 ;
int libero_m_ = 0 ; /* libero_m_==1 controllo tutti i
vettori a
ogni chiamate di free(); serve insieme a name_ per individuare le
routines che
sovrascrivono la memoria che non hanno (e.g. if(libero_m_)
init_w("nome_routines");) */

typedef struct {
void *p;
unsigned size;
unsigned piu;
unsigned meno;
}vettore_array;

static vettore_array **p_p_p_=0; /* lista di struct di puntatori
ritornati da malloc_m */
static unsigned i_i_i_=0; /* attuale indice nella lista */
static unsigned m_m_m_=0; /* massimo indice nella lista */
static char **list_ =0; /* lista dei vettori richiesti al
sys */
static unsigned list_i_=0;
static unsigned list_m_=0;
static int mem_init(unsigned siz)
{vettore_array **pp;
unsigned j;
/*---------------------*/
//printf("p_p_p_=%p i_i_i_==%u siz=%u ", (void*) p_p_p_, i_i_i_,
siz );
if(p_p_p_==0)
{pp= (vettore_array**) malloc( (siz+1) * sizeof *pp );
if(pp==0) return 0;
for( j=0; j<siz; ++j)
{pp[j]= (vettore_array*) malloc( sizeof(vettore_array) );
if(pp[j]==0)
{if(j!=0)
for( --j ; j!=0 ; --j)
free( (void*) pp[j] );
free((void*) pp[0]); free((void*) pp); return 0;
}
}
}
else { if(siz==m_m_m_) return 1;
else if(siz < m_m_m_) /* dovrebbe distruggere la
memoria eccessiva */
{ if(siz<=i_i_i_) return 1; /* la 1024ma volta che viene
chiamato free_m()*/
for(j=siz; j<m_m_m_; ++j) // v[0]...v[size]=size+1
free((void*) p_p_p_[j]);
pp=(vettore_array**) realloc(p_p_p_, (siz + 1) * sizeof
*pp );
if(pp==0) {printf("Fallimento realloc\n"); m_m_m_ =
siz; return 1;}
/* ritorna senza cambiare niente */
goto label;
}
pp= (vettore_array**) realloc( (void*) p_p_p_, (siz + 1) *
sizeof *pp);
if(pp==0) {printf("Fallimento realloc\n"); return 0;}
if( siz > i_i_i_)
{ for( j=i_i_i_; j<siz; ++j)
{pp[j]= (vettore_array*) malloc(
sizeof(vettore_array) );
if(pp[j]==0)
{if(j!=0)
for( --j ; j!=0 ; --j)
free( (void*) pp[j] );
free((void*) pp[0]); return 0;
}

}
}
}
label: ;
m_m_m_ = siz; p_p_p_=pp; return 1;
}

/* malloc_m: allocatore di memoria */
void* malloc_m(unsigned nbytes)
{Header *p, *prevp;
unsigned nunits, *k, *kk, led, size;
Header* morecore(unsigned);
unsigned verifica_all_m( void );
void stato_mem(void);
/*-------------------------------*/
if(libero_m_)
{
if(verifica_all_m()==0)
stato_mem();
}
if(i_i_i_>MEM_LIMIT || nbytes==0 ) return 0;
if(i_i_i_>=m_m_m_)
{if(mem_init( i_i_i_ + MAX_ARRAYS ) == 0) return 0;}
nunits = nbytes + sizeof(Header);
nunits = nunits/sizeof(Header) + (( nunits%sizeof(Header)

sizeof(unsigned) ) ? 1: 0) + 1;


if((prevp=freep)==NULL) /* non esiste la free list */
{ base.s.ptr=freep=prevp=&base; base.s.size=0; }
for(p=prevp->s.ptr; ; prevp=p, p=p->s.ptr)
{if(p->s.size>=nunits) /* spazio insufficiente */
{if(p->s.size==nunits) /* esattamente */
{
prevp->s.ptr = p->s.ptr;
}
else /* alloca la parte finale */
{
p->s.size -= nunits;
p += p->s.size;
p->s.size =nunits;
}
freep = prevp;
/****************** Blocco aggiunto ************/
size = nbytes;
led = (size % sizeof(unsigned)!=0) ? 1: 0;
k = (unsigned*)(p+1); kk=k; --k;
p_p_p_[i_i_i_]->meno = *k;
p_p_p_[i_i_i_]->piu = kk[size/sizeof(unsigned)+ led];
p_p_p_[i_i_i_]->size = size;
p_p_p_[i_i_i_++]->p = (void*)(p+1);
/***********************************************/
return (void*) (p+1);
}
if(p==freep) /* la free list e'' terminata */
{++yuyuy; /* numero delle volte di mem.
richieste al sistema */
if((p=morecore(nunits)) == NULL)
return NULL; /* non c''e'' piu'' spazio */
}
}
}

/* Ritorna il numero degli elementi;
se il numero degli elementi e'' 0 ritorna (unsigned) -1
se errori ritorna 0 */
unsigned verifica_all_m( void )
{unsigned j, *k, *kk, xk, xkk, led;
/*----------------*/
if( p_p_p_==0 || i_i_i_==0 ) return -1;
for(j=0 ; j < i_i_i_ ; ++j)
{k = (unsigned*) (p_p_p_[j]->p); kk=k; --k;
led = (p_p_p_[j]->size % sizeof(unsigned)!=0) ? 1: 0;
if( (xk=kk[p_p_p_[j]->size/sizeof(unsigned) + led]) !=
(xkk=p_p_p_[j]->piu) )
{

/* nota bene: n:v significa NUOVO VALORE : VECCHIO VALORE */

sprintf(memo_ , "verifica_all_mMEM_+ p=%5p size=%5u p[-1]=%5u
p[max]=%5u n:v=%5u:%5u",
p_p_p_[j]->p, p_p_p_[j]->size, p_p_p_[j]->meno,
xkk, xk, xkk);

if(n_i_>2) name_[ n_i_ - 2 ]=''+'';
return 0;
}
if( (xk=*k) != (xkk=p_p_p_[j]->meno) )
{ sprintf(memo_ , "verifica_all_mMEM_- p=%5p size=%5u
p[-1]=%5u p[max]=%5u n:v=%5u:%5u",
p_p_p_[j]->p, p_p_p_[j]->size, xkk,
p_p_p_[j]->piu, xk, xkk);
if(n_i_>2) name_[n_i_ - 2]=''-'';
return 0;
}
}
return i_i_i_;
}

void verifica_all( void )
{if(verifica_all_m( )==0)
{printf("Errore nella memoria\n");
printf("memo=%s name=%s\n", memo_, name_ );
}
}

/* ritorna 0 se il vettore fa parte della lista
se pointer==0 ritorna 1 se tutto e'' cancellato
2 se tutto e'' cancellato tranne il puntatore iniziale
3 altrimenti
*/
unsigned verifica_m( void* pointer, unsigned *jj)
{unsigned j, *k, *kk, xk, xkk, led;
/*----------------*/
if(jj!=0) *jj=0;
if(pointer==0)
{if( i_i_i_==0 && p_p_p_==0 ) return 1;
else if(i_i_i_==0) return 2;
else return 3;
}
if(p_p_p_==0 ) return 1;
for(j=0 ; j < i_i_i_ ; ++j)
if( p_p_p_[j]->p == pointer ) break;
if(j==i_i_i_ ) {printf("verifica_mMEM_0 %p indice=%u memo=%s
name=%s\n", pointer, i_i_i_, memo_, name_ );
if(n_i_>2) name_[n_i_ -2]=''0''; return 7;
}
k = (unsigned*) pointer; kk=k; --k;
led = (p_p_p_[j]->size % sizeof(unsigned)!=0) ? 1: 0;
*jj=j;
if( (xk=kk[p_p_p_[j]->size/sizeof(unsigned) + led]) !=
(xkk=p_p_p_[j]->piu) )
{ printf("p=%p size=%u p[-1]=%u p[max]=%u ", pointer,
p_p_p_[j]->size, *k, xk);
printf("verifica_mMEM_+ n:v>%u:%u\n", xk, xkk);
if(n_i_>2) name_[ n_i_ - 2 ]=''+'';
return 8;
}
if( (xk=*k) != (xkk=p_p_p_[j]->meno) )
{ printf("p=%p size=%u p[-1]=%u p[max]=%u ", pointer,
p_p_p_[j]->size, xkk, p_p_p_[j]->piu);
printf("verifica_mMEM_- n:v>%u:%u\n", xk, xkk);
if(n_i_>2) name_[n_i_ - 2]=''-'';
return 9;
}
else return 0;
}

unsigned verifica_p_m( void* pointer)
{unsigned jj;
return verifica_m( pointer, &jj);
}

static void free_list_m(void)
{while( list_i_ !=0 )
{--list_i_; free(list_[list_i_]);}
free(list_); list_=0; list_m_=0; freep=NULL;
}

static void free_vettore_m(void)
{if(p_p_p_==0) { m_m_m_=0; i_i_i_=0; return;}
while( i_i_i_ !=0 )
{--i_i_i_; free((void*) p_p_p_[i_i_i_]); }
free((void*) p_p_p_);
p_p_p_=0; m_m_m_=0;
}
static void inserisci(void* ap, unsigned jk, unsigned j)
{Header *bp, *p;
static unsigned f_cont=0;
/*-------------------*/
if(jk==0) ++f_cont;
bp = (Header*)ap - 1; /* punta all''header del blocco */
for( p=freep; !(bp>p && bp < p->s.ptr); p=p->s.ptr )
if( p >= p->s.ptr && (bp>p || bp < p->s.ptr) )
break; /* il blocco liberato e''
ad un estremo della lista*/
if(jk) goto label;
/********************************************/
if(j != i_i_i_ - 1)
{
p_p_p_[j]->p = p_p_p_[i_i_i_ - 1]->p;
p_p_p_[j]->size = p_p_p_[i_i_i_ - 1]->size;
p_p_p_[j]->meno = p_p_p_[i_i_i_ - 1]->meno;
p_p_p_[j]->piu = p_p_p_[i_i_i_ - 1]->piu;
}
p_p_p_[--i_i_i_]->p =0; p_p_p_[i_i_i_]->size=0;
p_p_p_[i_i_i_]->meno=0; p_p_p_[i_i_i_]->piu =0;
if(m_m_m_>1000 && f_cont%1024==0)
mem_init(i_i_i_+64);
/***********************************************/
label:
if(bp+bp->s.size == p->s.ptr)/*lo unisce al blocco dopo*/
{bp->s.size += p->s.ptr->s.size;
bp->s.ptr = p->s.ptr->s.ptr;
}
else bp->s.ptr=p->s.ptr;

if(p+p->s.size == bp)/* lo unisce al blocco prima*/
{p->s.size += bp->s.size;
p->s.ptr = bp->s.ptr;
}
else p->s.ptr=bp;

freep = p;
}

void free_all_m(void) {free_vettore_m(); free_list_m();}

/*Non usare free_all_m() ma free_a_i_m se ci sono oggetti
allocati da costruttori e distruttori del c++
(gli oggetti fuori da una qualsiasi procedura finiscono quando si
chiude
l''ultima istruzione del main) */
void free_a_i_m(void)
{if(i_i_i_==0)
{free_vettore_m(); free_list_m(); printf("MEMORIA DINAMICA
LIBERATA\n"); }
}
#define NALLOC 1024 /* numero minimo di unita'' richieste */

/* morecore: chiede al sistema memoria aggiuntiva */
static Header* morecore(unsigned nu)
{char *cp, **p;
Header *up;
unsigned len;
/*-----------------------*/
if(nu<NALLOC) nu=NALLOC;
cp = (char*) malloc(nu * sizeof(Header));
if( cp==0 ) /* non c''e'' piu'' spazio */
return NULL;

if(list_i_ <= list_m_ )
{len = (list_m_==0 ? 128: 2*list_m_);
p = (char**) realloc(list_, len * sizeof *p);
if(p==0)
{free(cp); return 0;}
list_ = p;
list_m_ =len;
}
list_[list_i_++]=cp;

up=(Header*) cp;
up->s.size=nu;
inserisci((void*)(up+1), 1, 0);
return freep;
}

/* se pointer!=0 ritorna la size del pointer
ritorna 0 se il pointer non c''e'' */
unsigned get_size_m( void* pointer )
{unsigned j;
/*----------------*/
if(pointer==0 || p_p_p_==0) return 0;
for(j=0 ; j < i_i_i_ ; ++j)
if( p_p_p_[j]->p == pointer ) break;
if(j==i_i_i_ ) return 0;
return p_p_p_[j]->size;
}

void init_w(const char *nam)
{unsigned i, j;
/*---------------------*/
if(nam==0) return;
if( n_i_ > 2 )
name_[n_i_ - 1]=''|'';
if( n_i_ >= 1016 ) // 0..14 carattere 15=''|''
n_i_=0;
for(i=n_i_, j=0; j<15 && nam[j]!=0; ++i, ++j)
name_[i]=nam[j];
for( ; j< 15; ++i, ++j)
name_[i]='' '';
name_[i] = ''#'';
n_i_ += 16;
}

void leggi_mem(void)
{Header *u, *v;
unsigned j;
for( u = freep; u!=0 ; )
{printf("|v=%u s=%u|", (unsigned)u / sizeof(Header), u->s.size );
if(u->s.ptr==freep) break;
v=u->s.ptr;
if((u + u->s.size) != v)
{j = (UNS)(v-u) - u->s.size;
if(j<123456)
printf("%u", j );
else printf("#");
}
u=v;
}
}
void stato_mem(void)
{unsigned j;
leggi_mem();
fflush(stdout);
printf("\nRAPPORTO MEMORIA DINAMICA. ");
printf("Memoria richiesta al sistema=%u volte. ", yuyuy);
j=verifica_all_m();
if(j!=0 && j!=-1) printf("%u vettori allocati con successo\n", j);
else {if(j==0) goto label;
printf("Tutto bene. ");
j=verifica_m(0, 0);
if(j==1) printf("Sia la base sia il contatore sono NULLI\n");
else if(j==2) printf("Il contatore e'' nullo ma la base no\n");
else {label: ;
printf("Errore nella memoria\n");
printf("memo=%s name=%s\n", memo_, name_ );
free_vettore_m(); free_list_m();
exit(0);
}
}
}

void controlla_m(char* st)
{printf("!%s!", st);
fflush(stdout);
if(verifica_all_m()==0)
{if(st) printf("ERRORE!");
fflush(stdout);
stato_mem();
}
}
/* free: inserisce in free list il blocco ap */
void free_m(void* ap)
{ unsigned j;
/*-------------------*/
if(ap==0) return ;
if(libero_m_)
{
if(verifica_all_m()==0)
stato_mem();
}
if(verifica_m(ap, &j))
{ printf("free_m(): "); stato_mem();
free_vettore_m(); free_list_m();
exit(0);
}
inserisci(ap, 0, j);
}

void stampa_chiamate(void){printf("memo=%s name=%s\n", memo_, name_
);}

#ifdef __cplusplus
}
#endif
// fine di extern C
/*************************CCCCCCC****************** ****************/
/* file.c che utilizza malloc_m()
c_compiler file.c mallocm.obj */
#include <stdio.h>
#include <stdlib.h>
#ifdef __cplusplus
extern "C" {
#endif
void* malloc_m(unsigned nbytes);
unsigned verifica_all_m( void );
unsigned verifica_m( void* pointer, unsigned *jj);
unsigned verifica_p_m( void* pointer);

void free_m(void* ap);
void free_all_m(void);
void free_a_i_m(void);
unsigned get_size_m( void* pointer );
void stato_mem(void);
void leggi_mem(void);
void controlla_m(char* st);
void verifica_all( void );
void init_w(const char *nam);
void stampa_chiamate(void);
#ifdef __cplusplus
}
#endif

extern int libero_m_ ;

void g(void)
{char *r;
/**********************/
if(libero_m_) init_w("g() ");
r=malloc_m(100*sizeof(*r));
r[-1]=''8''; /* errore per r[-1] */
/* errore non liberato r */
// free_m(r);
/* errore se non uso free_m(r) ed stato_mem() in main mi dice
"RAPPORTO MEMORIA DINAMICA. Memoria richiesta al sistema=1 volte.
1 vettori allocati con successo "
significa che mi sono dimenticato di cancellare un vettore
*/
}

void f(void)
{char *p;
int i;
/*********************/
if(libero_m_) init_w("f() ");
p=malloc_m(100*sizeof(*p));
for(i=0; i<110; ++i) p[i]=''0''; /* errore per i>=100 */
free_m(p); /* se libero_m_ = 1; identifica routine dell''errore */
/* se libero_m_ = 0; (default) identifica un errore */
g();
}
int main(void)
{// libero_m_ = 1; // scrive routines ove e'' identificato l''errore
// se si identifica errore => "libero_m_ = 1;"
// nel codice normale ove non si identificano errori *non* si
// deve scrivere "libero_m_ = 1;"
if(libero_m_) init_w("main");

f();

stato_mem(); /* identifica eventuali errori e "momory leaks"*/
free_all_m(); /* si deve usare prima di uscire dal programma */
stato_mem(); /* se succede
"RAPPORTO MEMORIA DINAMICA. Memoria richiesta al sistema=1 volte.
Tutto bene. Sia
la base sia il contatore sono NULLI"
tutto sembra ok */
return 0;
}

解决方案

cs wrote:

This is the function malloc_m() that should be like malloc() but it
should find memory leak, and over bound writing in arrays.

How many errors do you see? ...



See...

http://groups-beta.google.com/group/...malloc+wrapper

--
Peter


In alt.lang.asm cs <n@ss.g> wrote:

How many errors do you see?



0) Overlong included text
1) Italian language code posted to English language newsgroups
2) No asm code posted to an asm newsgroup. ASM doesn''t have
malloc(), and nor is it a syscall [but a libc fn]

-- Robert


In article <t1***************@newssvr12.news.prodigy.com>,
Robert Redelmeier <re****@ev1.net.invalid> wrote:
:In alt.lang.asm cs <n@ss.g> wrote:
:> How many errors do you see?

:1) Italian language code posted to English language newsgroups

Where??

comp.lang.c and alt.lang.asm are certainly predominately
English in their discussions, but they do not have charters
restricting discussions or variable names or comments to English.

If someone posts on a topic or in a language that relatively few
readers understand, then they are not going to receive as much
feedback as they might otherwise, but that is not an *error*.
It isn''t even any more Undefined Behaviour (UB) than any other posting.
At most it is a Quality of Implementation matter.

--
"I want to make sure [a user] can''t get through ... an online
experience without hitting a Microsoft ad"
-- Steve Ballmer [Microsoft Chief Executive]


这篇关于malloc和内存泄漏的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆