Einzelnen Beitrag anzeigen

Benutzerbild von d3g
d3g

Registriert seit: 21. Jun 2002
602 Beiträge
 
#12
  Alt 3. Okt 2002, 18:28
Hi Stephan,

du musst immer etwas freigeben, wenn du Speicher reservierst. Da gibt es bestimmte Befehlspaare.
  • Zu jedem TObject.Create muss auch ein TObject.Free. Wichtig ist, dass du nicht vor dem freigeben der Variable ein anderes Objekt zuweist:
    Code:
    var
      a: array[1..100] of TStringList;
      i: Integer;

    // ...

    for i := 1 to 100 do
      a[i] := TStringList.Create;
    // Arbeiten mit den Stringlists
    for i := 1 to 100 do
      a[i] := TStringList.Create;
    Die ersten 100 Stringlists sind verloren, du wirst nie wieder auf sie zugreifen können. Richtig wäre folgendes:
    Code:
    for i := 1 to 100 do
      a[i] := TStringList.Create;
    for i := 1 to 100 do
      a[i] := TStringList.Free;
    // Arbeiten mit den Stringlists
    for i := 1 to 100 do
      a[i] := TStringList.Create;
    for i := 1 to 100 do
      a[i] := TStringList.Free;
  • Zu jedem GetMem/StrAlloc etc. muss auch ein FreeMem/StrDispose etc.

    Auch hier gilt: wenn du einem Pointer eine neue Speicherstelle zuweist, dann wars das.

    Tödlich:
    Code:
    var
      p: Pointer;

    // ...

    GetMem(p, 10240); // 10 kb Speicher
    // Arbeiten mit p
    GetMem(p, 20480); // 20 kb
    Richtig:
    Code:
    GetMem(p, 10240); // 10 kb Speicher
    FreeMem(p);
    // Arbeiten mit p
    GetMem(p, 20480);
    FreeMem(p);
MfG,
d3g
-- Crucifixion?
-- Yes.
-- Good. Out of the door, line on the left, one cross each.
  Mit Zitat antworten Zitat