Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.835 Beiträge
Delphi 12 Athens
|
AW: Array korrekt freigeben
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
|
|
Zitat
|