Thema: Delphi Array korrekt freigeben

Einzelnen Beitrag anzeigen

Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.835 Beiträge
 
Delphi 12 Athens
 
#9

AW: Array korrekt freigeben

  Alt Gestern, 21:46
Wenn ich den Record mit getmem erzeugt habe vielleicht doch?
Beispiel:
Delphi-Quellcode:
procedure ExDynRecord;
type
  PMyRec = ^TMyRec;
  TMyRec = record
    MyString: string;
  end;
var
  MyRec: TMyRec; { die Deklaration sorgt dafür, dass MyRec finalisiert wird }
  MyPtr: PMyRec;

  procedure Log(LogIdx: Integer);
  begin
    if MyPtr = nil then
      Writeln(LogIdx, ': ', StringRefCount(MyRec.MyString))
    else
      Writeln(LogIdx, ': ', StringRefCount(MyRec.MyString), ':', StringRefCount(MyPtr.MyString));
  end;

begin
  MyRec.MyString := 'Hello World';
  UniqueString(MyRec.MyString); { Referenzzähler auf 1 setzen (wegen des Literals wäre das sonst -1) }
  MyPtr := nil;
  Log(0);

  MyPtr := @MyRec; { ein Record - ein String }
  Log(1);
  { hier ist keine Finalisierung für MyPtr^ notwendig }
  MyPtr := nil;
  Log(2);

  New(MyPtr);
  Log(10);
  MyPtr^ := MyRec; { überträgt den Inhalt von MyRec in den dynamischen Record. Der Referenzzähler des String wird erhöht.}
  Log(11);
  Dispose(MyPtr);
  Log(12);
  { auch hier ist keine Finalisierung für MyPtr^ notwendig }
  MyPtr := nil;
  Log(13);

  GetMem(MyPtr, Sizeof(TMyRec));
  Log(20);
  MyPtr^ := MyRec; { s.o. }
  Log(21);

  { aber hier ist eine Finalisierung für MyPtr^ notwendig, andernfalls bleibt der string bestehen }
// Finalize(MyPtr^);
  Log(22);
  FreeMem(MyPtr);
  Log(23);

  MyRec.MyString := '';
  Log(30);
end;
Ausgabe ohne Finalize:
Code:
0: 1
1: 1:1
2: 1
10: 1:0
11: 2:2
12: 1:0
13: 1
20: 1:0
21: 2:2
22: 2:2
23: 2:2
30: 0:1
Ausgabe mit Finalize:
Code:
0: 1
1: 1:1
2: 1
10: 1:0
11: 2:2
12: 1:0
13: 1
20: 1:0
21: 2:2
22: 1:0
23: 1:0
30: 0:0
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat