Moduły » System

GetMem

  • 2010-10-31 18:27
  • 2 komentarze
  • 541 odsłon
  • Oceń ten tekst jako pierwszy
GetMem
Moduł: System

procedure GetMem(var P: Pointer; Size: Integer);

Funkcja służy do alokowania pamięci na stercie.

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 jest 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 System a zdefiniowana w 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 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 te programy większe od programów skompilowanych innymi kompilatorami.

Zobacz też:

2 komentarze

Wolverine 2006-02-04 20:45

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.

Adam Boduch 2006-02-04 14:51

Artykuly redagujemy zgodnie z zasadami ktore zostaly opisane w Pomocy: Pomoc

Czy ktos molby zweryfikowac czy informacje tu podane sa prawidlowe?