Sabes cual es el problema, vos estas haciendo un solo malloc, por lo que basta un solo free para liberar.
Si vos hubieras hecho un
for(i=0; i<num; i++)
bufferfloat+i = (float *) malloc ( sizeof(float));
estaria bien liberar como lo estas haciendo, pero al pedir un solo bloque de tamaño num * sizeof(float) basta con que liberes solo la direccion que obtuviste.
Espero haber sido claro.
Saludos.