La parte que no acabas de entender se basa en una regla muy simple: toda la memoria que bloqueas con 'new' tienes que liberarla con 'delete'. En este caso puedes hacer lo mismo con 'malloc' y 'free' porque estas trabajando con tipos char (con objetos no es aplicable).
Para liberar los campos O y D tienes que recorrer toda la lista y aplicarles el delete:
Código:
void buida_llista(list <DADES_ARXIU> *llista) {
list <DADES_ARXIU>::iterator itr;
for(itr = llista->begin(); itr != llista->end(); itr++) {
delete [] (*itr).O;
delete [] (*itr).D;
}
llista->clear();
}
//al finalizar llamas a la funcion
buida_llista(&llista);
La parte de bloquear memoria que la tienes comentada está bien:
Código:
case O: {
camps.O = new char[strlen(pch)];
memcpy(camps.O, pch, strlen(pch));
}
break;
Supongo que ya te habras dado cuenta: se guardan los caracteres sin dejar espacio para un \0 de final de texto; esto significa que si necesitas volcarlo a pantalla se puede dar el caso de que te muestre los caracteres seguidos de basura.
Y si no lo terminas de ver claro y no quieres liarte puedes dejar los campos O Y D como string y asignarles el pch tal como haces con P y FLA, pero es mas aburrido de programar.
Y la parte de reiniciar la struct no se si está bien pero me da la impresion de que no:
Con esto asignas 0 al primer elemento del struct, pero los demas ni se enteran. Si no llevara objetos (el string es un objeto) podrias aplicarle un memset y ya estaria; para ir sobre seguro me parece que deberias inicializar todos los campos del struct zero:
Código:
DADES_ARXIU zero = {0, 0, 0, 0, "", 0, "", 0, 0, 0, 0, 0};
Y para reiniciar el 'camps' le aplicas un memcpy y lo dejas como nuevo:
Código:
memcpy(&camps, &zero, sizeof(DADES_ARXIU));
vosk