Hola adeszeus.
Además de lo dicho por
rgstuamigo, cosa muy cierta ya que Free verifica la existencia del objeto antes de liberarlo, tambíen es importante
el sentido en que se ejecute el ciclo for.
Si lo haces de este modo:
Código Delphi
[-]
for i:= 0 to ComponentCount -1 do
Corres el riesgo de obtener errores de índice o que no se liberen algunos componentes.
Ya que cuando el un componente es borrado, la posición que tenía es ocupada inmediatamente por el componente sucesor.
Supongamos Components[1] ( componente 'A') es liberado; el componente 'B' ocupa su lugar.
Cuando vaya a liberar Components[2] en realidad estará liberando el 'C'. Y así sucesivamente...
Lo correcto sería:
Código Delphi
[-]
for i:= ComponentCount - 1 downto 0 do
Saludos.
Edito: Veo que
marcos fué más rápido en editar. ( la mala costumbre de no recargar la página...

)