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.