Como bien dice el compañero, por cada malloc, debe de haber un free.
Yo añadiria ademas que por lo regular al liberar punteros, se deben liberar en order inverso a como fueron creados, no es obligatorio, pero si recomendado, ejemplo:
int *puntero1, *puntero2, *puntero3;
puntero1 = (int*) malloc(sizeof(int));
puntero2 = (int*) malloc(sizeof(int));
puntero3 = (int*) malloc(sizeof(int));
free(puntero3);
free(puntero2);
free(puntero1);
Saludos