Zwolnienie TBitmap w funkcji...

0

Siema!

Słuchajta, mam sobie funkcje np.

function PobierzPlotno () : TBitmap;
var tmpBMP : tBitmap;
begin

tmpBMP := tBitmap.Create;

... (malowanie cos na tej bitmapie)

Result := tmpBMP;

end;

A moje pytanie brzmi. Istnieje możliwość zwolnienia tej Bitmapy po zwróceniu Resulta? Chyba, że to się robi samo, ponieważ ta funkcja będzie odpalana kilkaset razy i nie chcę aby się coś przepełniło (np. pamięć)...

0
tmpBMP.Free

Ale chyba po zakończeniu funkcji samo zwalnia pamięć.

0

no ja wiem jak się zwalnia, tylko chcę być pewien czy po zakończeniu funkcji zwalnia naprawdę tą pamięć... :)

0

Dla pewności nigdy nie zaszkodzi dać :D :D :D Ale teoretycznie pamięć jest zwalniana automatycznie.

0

obawiam się, że funkcja zwolni tylko 4 bajty przeznaczone na wskaźnik do bitmapy. Bitmapa zostanie w pamięci.
W opisanej sytuacji powinieneś robić tak (w callerze)

var Costam:TBitmap

begin
//bez create bo stworzy funkcja

Costam:=PobierzPlotno;

//robienie czegos z Costam
Costam.Free;

Bardziej elegancko byloby pewnie nie tworzyc bitmapy wewnatrz funkcji, tylko w callerze, zeby tworzenie i zwalnianie odbywało się w tej samym bloku kodu. Ale techinicznie moze byc tworzona w funkcji a zwalniana w callerze.

W samej funkcji nie możesz zwolnić bitmapy, bo co zrobisz z wynikiem po powrocie?

0
Laik napisał(a)

A moje pytanie brzmi. Istnieje możliwość zwolnienia tej Bitmapy po zwróceniu Resulta?

Jeśli dobrze myślę, to chodzi Ci o to, czy podprogram po zwróceniu wyniku kończy się (jak return w C/C++). Odpowiedź brzmi: nie. Do zmiennej Result przypisujesz i odczytujesz co chcesz, jak chcesz i kiedy chcesz (oczywiście, zgodnie z zasadami Object Pascala) :) . Jeśli chcesz zasymulować np. w instrukcji warunkowej return z C/C++ robisz tak:

if Warunek then
begin
  Result := True; // np.
  Exit;
end;

// DOPISANE:
Deti, skoro ten rezultat tylko po to, żeby się kompilator nie pluł, to po prostu procedurę zrobić.

//nie żeby się nie pluł, tylko żeby wiedzieć czy procka zrobiła co miała zrobic. pq

0

ok, dzięki wszystkim :)

0

Nie rób funkcji, gdzie rezultat będzie taki, że później tego nie zwolnisz - najlepiej przekazać sobię tą Bitmapę przez referencję.

function SomeConvert(var Bitmap: TBitmap): Boolean;

To Boolean tylko dla porządku bo jakiś rezultat musi być (np. czy operacja się powiodła) - teraz sobie możesz zwolnić Bitmap w programie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1