GetMem
dj
Parametr P może być dowolnego typu wskaźnikowego, natomiast Size określa ilość bajtów, które zostaną zarezerwowane. Dostęp do zaalokowanej pamięci odbywa się poprzez P^. Przykład:
var
P : Pointer;
begin
GetMem(P, 1024);
{ operacje }
FreeMem(P); // zwolnienie pamięci
end.
Funkcja GetMem jest zdefiniowana i zadeklarowana w module System jako:
procedure _GetMem;
Traktowana jest jako procedura wbudowana. Poniżej kod tej procedury:
procedure _GetMem;
asm
TEST EAX,EAX
JE @@1
CALL MemoryManager.GetMem
OR EAX,EAX
JE @@2
@@1: RET
@@2: MOV AL,reOutOfMemory
JMP Error
end;
Jak widać procedura ta korzysta z menadżera pamięci, który jest zadeklarowany w module System:
PMemoryManager = ^TMemoryManager;
TMemoryManager = record
GetMem: function(Size: Integer): Pointer;
FreeMem: function(P: Pointer): Integer;
ReallocMem: function(P: Pointer; Size: Integer): Pointer;
end;
// ...
MemoryManager: TMemoryManager = (
GetMem: SysGetMem;
FreeMem: SysFreeMem;
ReallocMem: SysReallocMem);
function SysGetMem(size: Integer): Pointer;
Funkcja SysGetMem jest zadeklarowana w module System, a zdefiniowana w pliku dołączanym getmem.inc. Jej zadaniem jest zwrócenie wskaźnika na blok pamięci o rozmiarze size oraz dodaniu odpowiednich informacji do menadżera pamięci. Dzięki takiemu mechanizmowi pamięć, która została zaalokowana przez GetMem powinna zostać zwolniona podczas zamykania aplikacji (odpowiedni wpis w sekcji Finalization modułu System). Ale ma to swoją wadę, bo nawet do aplikacji konsolowych cała zawartość modułu jest wstawiana do wynikowego programu, co czyni je większe od programów skompilowanych innymi kompilatorami.
Zobacz też:
Glowy nie daje ale jak aplikacja jest zamykana, zwalniana jest cala sterta (przez system ktory odpowiedzialny jest za alokacje sterty /nie na stercie/), a przynajmniej jak tam mam w swoim osie i nie widze powodu dlaczego w windowsie mialoby byc inaczej.
Artykuly redagujemy zgodnie z zasadami ktore zostaly opisane w Pomocy: Pomoc
Czy ktos molby zweryfikowac czy informacje tu podane sa prawidlowe?