HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Memóriakezelés Delphi-ben


CopyMemory, MoveMemory, FillMemory és ZeroMemory függvények bemutatása

Példaprogram letöltése

3838 bájt

Gyakran előfordulhat, hogy miközben adatainkkal dolgozunk, ideiglenesen el szeretnénk tárolni azokat, azonban nem akarunk fizikailag a merevlemezre menteni semmit. Ilyenkor célszerű a memóriában eltárolni azokat, majd onnan visszaolvasni, miután a megfelelő műveleteket elvégeztük adatainkon. A következő példában a memória kezelésére szolgáló függvényekkel ismerkedünk meg.

A következőkben bemutatásra kerülő függvények mind a Windows függvényhívások közé tartoznak.
Amennyiben egy memóriatartományt szeretnénk átmásolni egyik helyről a másikra, a CopyMemory függvényt kell használnunk.
CopyMemory
procedure CopyMemory(
Destination: Pointer;
Source: Pointer;
Length: DWORD
);
Paraméterek
Destination: Pointer
A célhely kezdőcímére mutató pointer.
Source: Pointer
A másolandó memóriatartomány kezdőcímére mutató pointer.
Length: DWORD
A másolandó memóriablokk mérete byte-okban megadva.
Megjegyzés
A Destination paraméternek elég nagynak kell lennie ahhoz, hogy a Source-ben megadott másolandó memóriablokkot el tudja tárolni, máskülönben buffer-túlcsordulás következik be.
Nézzük a példaprogramunkat:
  ListBox2.Clear;
  GetMem(MyIntArr,SizeOf(integer) * 10);
Lefoglaljuk a tömbünk számára elegendő memóriatartományt, illetve kapunk egy MyIntArr nevű pointer-t, mely a lefoglalt memóriaterület kezdőcímére mutat.
for I := 0 to ListBox1.Count-1 do
  begin
    Int := StrToInt(ListBox1.Items[I]);
    CopyMemory(@MyIntArr^[i],@Int,SizeOf(Int));
    CopyMemory(@MyIntArr^[i+ListBox1.Count],@Int,SizeOf(Int));
  end;
  for I := 0 to (ListBox1.Count*2)-1 do
  begin
    ListBox2.Items[i]:=IntToStr(MyIntArr^[i]);
  end;
A példában rögtön két másolást hajtunk végre. Először a ListBox1 elemeit egyenként átmásoljuk a pointer által meghatározott memóriacímre, majd az adatokat újra a memóriába másoljuk, de a pointer-t már a ListBox1.Count értékkel eltolva. Ellenőrzésként a ListBox2-ben ki is íratjuk az átvitt értékeket.
Amennyiben a memóriában adatainkat mozgatni szeretnénk, a MoveMemory függvényt kell használnunk.
Felépítése hasonló a CopyMemory függvényhez:
MoveMemory
procedure MoveMemory(
Destination: Pointer;
Source: Pointer;
Length: DWORD
);
Paraméterek
Destination: Pointer
A célhely kezdőcímére mutató pointer.
Source: Pointer
Az átmozgatandó memóriatartomány kezdőcímére mutató pointer.
Length: DWORD
Az átmozgatandó memóriablokk mérete byte-okban megadva.
A példánkban ez a következőképpen néz ki:
  ListBox2.Clear;
  GetMem(MyIntArr,SizeOf(integer) * 10);
Lefoglaljuk a megfelelő memóriaterületet.
  for I := 0 to ListBox1.Count-1 do
  begin
    Int:=StrToInt(ListBox1.Items[I]);
    CopyMemory(@MyIntArr^[i],@Int,SizeOf(Int));
A ListBox1 elemeit bemásoljuk a memóriába.
    MoveMemory(@MyIntArr^[i+ListBox1.Count],@MyIntArr^[i],1);
A ListBox1.Count értékkel eltoljuk a mutatót, és elmozgatjuk az előzőleg bemásolt adatokat.
  end;
  for I := 0 to (ListBox1.Count*2)-1 do
  begin
    ListBox2.Items[i]:=IntToStr(MyIntArr^[i]);
  end;
A ListBox2-be kiíratjuk az eredményt.
Amennyiben egy meghatározott értékkel szeretnénk feltölteni a memóriatartományt, a FillMemory függvényt hívhatjuk segítségül.
FillMemory
procedure FillMemory(
Destination: Pointer;
Length: DWORD;
Fill: Byte
);
Paraméterek
Destination: Pointer
A célhely kezdőcímére mutató pointer.
Length: DWORD
A feltöltendő memóriablokk mérete byte-okban
Fill: Byte
Az a byte érték, mellyel a memóriát fel szeretnénk tölteni.
Lássuk a példaprogramot:
  ListBox2.Clear;
  GetMem(MyIntArr,SizeOf(integer) * 10);
  num:=28;
  for I := 0 to ListBox1.Count-1 do
  begin
    ZeroMemory(@MyIntArr^[i],SizeOf(Int));
Első lépésben lenullázzuk a memória tartalmát.
    FillMemory(@MyIntArr^[i],1,num);
Ezután feltöltjük a num byte típusú változóban megadott értékkel, mely esetünkben 28 lesz.
    ListBox2.Items[i]:=IntToStr(MyIntArr^[i]);
  end;
A ListBox2-be kiíratjuk az eredményt.
Az előbbi programrészletben találkozhattunk a ZeroMemory függvénnyel, így hát vizsgáljuk meg azt is. Segítségével a memória meghatározott tartományát nullázni tudjuk – azaz nullával töltjük fel.
ZeroMemory
procedure ZeroMemory(
Destination: Pointer;
Length: DWORD
);
Paraméterek
Destination: Pointer
A célhely kezdőcímére mutató pointer.
Length: DWORD
A nullázandó memóriablokk mérete byte-okban.
Példánkban ez a következő:
  ListBox2.Clear;
  GetMem(MyIntArr,SizeOf(integer) * 10);
  for I := 0 to ListBox1.Count-1 do
  begin
    Int := StrToInt(ListBox1.Items[I]);
    ZeroMemory(@MyIntArr^[i],SizeOf(Int));
Az Int változó által meghatározott méretű memóriablokkot nullával töltjük fel.
    ListBox2.Items[i]:=IntToStr(MyIntArr^[i]);
  end;
Az eredményt a ListBox2-ben listázzuk ki.

Könyv
Ez a cikk megtalálható ebben a könyvben: Delphi Software Offline 2003 évkönyv 492. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |