Liberare memoria occupata da variabili temporanee

Ciao a tutti,

Ho una domanda su C, scusate se e’ ovvia, ma non sono un esperto. Stavo cercando un memory leak, che ho trovato usando valgrind. Gia’ che ci sono sta dando un’occhiata agli altri problemi segnalati in output, e ne ho trovato uno che e’ interessante, perche’ non saprei come risolverlo.

Ho una funzione (codice non scritto da me) che deve appendere un membro (dotato di name, value, type e vary) a una linked list vars (struttura PippoVariables) (notate che ho tolto qualche print e checks per rendere la funzione piu’ leggibile):

[code]
void PippoAddVariable(PippoVariables * vars, const char * name, void value, PippoVariableType type, PippoParamVaryType vary)
/
Add the variable name with type type and value value to vars /
/
If variable already exists, it will over-write the current value if type compatible*/
{
PippoVariableItem *new=PippoMalloc(sizeof(PippoVariableItem));

memset(new,0,sizeof(PippoVariableItem));
if(new) {
new->value = (void *)PippoMalloc(PippoTypeSize[type]);
}

memcpy(new->name,name,VARNAME_MAX);
new->type = type;
new->vary = vary;
memcpy(new->value,value,PippoTypeSize[type]);
new->next = vars->head;
vars->head = new;
vars->dimension++;
return;
}[/code]

Ora, valgrind mi fa giustamente notare che ho usato malloc per riservare spazio per new e new-> value, ma che in seguito non ho usato free per tali variabili.
Il problema e’ che alla fine della funzione si fa puntare vars->head a new, per cui se si da free(new) si rompono le scatole a vars->head.

La memoria non e’ comunque spreacata, visto che e’ utilizzata da vars, quindi e’ solo valgrind che vede un leak dove non c’e’, oppure le regole del buon programmatore richiederebbero di scrivere questa funzione in modo diverso?

grazie
S.

non facile leggere un listato al buio.

questo applicativo su altri sistemi funziona regolarmente ?
in caso affermativo, con quale compilatore è stato compilato ?

[quote=virus]non facile leggere un listato al buio.

questo applicativo su altri sistemi funziona regolarmente ?
in caso affermativo, con quale compilatore è stato compilato ?[/quote]

Ciao Virus,

lo so, mi spiace :slight_smile:

No, il codice funziona regolarmente nel mio pc (non ho segfault o memory leaks ora) quindi non si parla di un problema grave, era giusto una curiosita’ per capire se e’ possibile ottimizzare il codice, visto che valgrind mi ha fatto notare questa cosa.
La funzione che ho copiato e’ una funzione accessoria, chiamata altrove nel codice (diverse centinaia di migliaia di volte) per appendere elementi a una linked list.

Per la compilazione, e’ tutto dentro dei giganteschi make, ma immagino sia gcc.

s.

cioè il codice funziona bene,
è valgrind che ti segnala questa possibilità ?
ho capito bene ?

esatto

[quote=virus]cioè il codice funziona bene,
è valgrind che ti segnala questa possibilità ?
ho capito bene ?[/quote]

ps: motivo per cui scrivevo nel primo post

:doc: