.Free -> Primero se asegura que el objeto es distinto de nil (puntero nulo), si es distinto, llama a Destroy
.Destroy -> elimina de memoria el objeto, si es un puntero nulo, dará un access violation.
"FLabelList" es de por sí, un puntero. Si le asignas nil y después llamas a Flabellist.Free no hará nada, pero la memoria que tenía asignada ¡¡se queda ahí reservada!! es lo que se llama, dejar el objeto en el limbo, (la memoria queda asignada pero no puedes acceder a esos elementos para nada).
Si después de todo esto, llamas a FlabelList.destroy, estás ordenando liberar la memoria de un puntero nulo, por eso casca.
Tu amigo te diría al contrario, es decir:
FlabelList.Free;
FlabelList := nil;
Si te lo dijo al revés, se le trastornó la neurona
.
Por supuesto, lo más
cómodo, como comodon que es nuestro amigo
xEsk: FreeAndnil(FlabelList); es lo que uso siempre
saludos