E' semplicemente un problema di free su puntatori non validi ... in ogni caso, è un problema di allocazione di memoria.

Le regole sono semplici ... ad ogni allocazione corrisponde una free (a patto che non ci siano errori nelle allocazioni).

Dato che non ho capito più su quale codice ragioniamo, posta *tutto* il codice compilabile (dove non manchi nulla, dalle strutture al main) in modo da fare copia-incolla, compilazione e test.