A lo que
Al se refiere en el punto 1 es a que la mera asignación:
Código Delphi
[-]
Image1.Picture.Graphic:= TJpegImage.Create;
podría causar una excepción, por ejemplo, por falta de memoria o alguna otra razón imprevisible, como son las excepciones. Si ese fuera el caso, dado que tal excepción no está protegida por un bloque try-except, el código donde liberas a BS (creado anteriormente) no llegaría a ejecutarse y tendrías una fuga de memoria.
Por otra parte, estoy de acuerdo en que un objeto no necesariamente debe destruirse en el mismo contexto en donde se creó ya que posteriormente puede usarse. Sin embargo, en el caso particular que muestras, dicha liberación jamás podría darse ya que pierdes toda referencia al objeto creado, que es lo que explica
Al. Cuando asignas:
Código Delphi
[-]
Image1.Picture.Graphic := TJpegImage.Create;
la parte derecha de la asignación crea un objeto que se pasa como parámetro al método TPicture.SetGraphic que citó
Al. Pero este objeto
no es el mismo que finalmente se guarda en el campo privado FGraphic de TPicture ya que Assign hará una
copia del objeto. Como el parámetro se pierde después de la llamada, no tienes ninguna variable que apunte al objeto y por tanto no podrás hacer invocar al método Free.
Si realmente se piensa usar posteriormente el objeto creado, tendrías que usar asignar el resultado de Create a una variable y ésta asignarla a TPictureGraphic:
Código Delphi
[-]
Graphic := TJpegImage.Create;
Image1.Picture.Graphic := Graphic;
Por otra parte, me da la impresión que nos hemos alejado de tu pregunta inicial. ¿Sigues teniendo el mismo problema que mencionas en el comentariio original?
// Saludos