GetMem

dj
GetMem
Moduł: System
```delphi procedure GetMem(var P: Pointer; Size: Integer); ``` [[Delphi/Funkcje|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 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ż:

2 komentarzy

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?