Die 1. Variante ist falsch und die 2. Variante ist richtig.
Der kommentierte Code macht es vielleicht verständlich:
Delphi-Quellcode:
var
SA : TStreamAdapter;
...
// hier wird ein Objekt vom Typ TStreamAdapter erzeugt
sa := TStreamAdapter.Create(JpegData);
// beim Aufruf wird im Hintergrund aus dem Objekt ein IStream-Interface erzeugt
// und dessen Referenzzähler um 1 hochgezählt
Image := TGPBitmap.Create(sa);
// nach dem Aufruf wird der Referenzzähler um 1 runtergezählt
// da nun aber der RefCount = 0 ist wird Free & Destroy aufgerufen
// zu diesem Zeitpunkt ist der StreamAdapter schon tot, obwohl er eigentlich jetzt gebraucht würde
Graphics.DrawImage(Image, 0, 0, Image.Width, Image.Height);
Rein theoretisch sollte Delphi merken, dass das übergebene IStream-Interface innerhalb von TGPBitmap noch benützt wird.
Dazu müsste die Klasse TGPBitmap intern aber _AddRef() aufrufen, tut es anscheinend aber nicht.