Forum: Sonstige Fragen zu Delphi
Delphi
by Neutral General,
26. Sep 2008
Soweit ich weiß, macht das keinen Unterschied.
Forum: Sonstige Fragen zu Delphi
Delphi
by Neutral General,
16. Sep 2008
Vergiss das Finalize nicht :stupid: ;)
Forum: Sonstige Fragen zu Delphi
Delphi
by Neutral General,
14. Sep 2008
Was hast du denn erwartet/gehofft? :gruebel:
Forum: Sonstige Fragen zu Delphi
Delphi
by Neutral General,
14. Sep 2008
Der String liegt weiterhin im Speicher rum und wird nicht freigegeben. (MemoryLeak)
Forum: Sonstige Fragen zu Delphi
Delphi
by Neutral General,
14. Sep 2008
Ich würde mal sagen: Damit wäre
bewiesen :P
Natürlich wird der String auch ohne Finalize zu einem Leerstring. Allerdings hinterlässt du ein MemoryLeak.
Du machst quasi folgendes:
Forum: Sonstige Fragen zu Delphi
Delphi
by Neutral General,
14. Sep 2008
Dieses Beispiel ist in diesem Thread hier total fehl am Platz. Dadurch, dass Hansa jetzt in seinem Record Shortstrings benutzt hat, gibts das Problem natürlich nicht. ShortStrings sind eben keine Pointer. Von daher ist ein Finalize tatsächlich nicht nötig. Was Hansa jetzt damit sagen/verdeutlichen will, weiß ich allerdings nicht. Mir scheint, als hätte er nicht verstanden, worum es hier in dieser...
Forum: Sonstige Fragen zu Delphi
Delphi
by Neutral General,
14. Sep 2008
ups :oops:
Hab aber nicht abgeschrieben, ehrlich :oops:
Forum: Sonstige Fragen zu Delphi
Delphi
by Neutral General,
14. Sep 2008
Ich gehe einfach mal davon aus, dass Finalize das übernimmt. Wie gesagt. Es gibt ohne Finalize ein MemoryLeak, mit nicht.
Edit: Hab mal was ausprobiert:
// EinString = 'Test';
procedure TRecord.Clear;
begin
ShowMessage(EinString); // 'Test'
Finalize(Self);
ShowMessage(EinString); // ''
Forum: Sonstige Fragen zu Delphi
Delphi
by Neutral General,
14. Sep 2008
Hi,
In den neueren Delphiversionen kann mans noch in eine Methode packen. Ist dann nachher etwas bequemer:
type
TRecord = record
// ...
procedure Clear;
end;
Forum: Sonstige Fragen zu Delphi
Delphi
by Neutral General,
14. Sep 2008
Finalize(Record);
FillChar(Record,SizeOf(TRecord),0);
Ist die ultimative Lösung :mrgreen: Damit werden auch Subrecords aufgeräumt. Habs ausprobiert.
Forum: Sonstige Fragen zu Delphi
Delphi
by Neutral General,
14. Sep 2008
Gleiches Ergebnis wie mit normalen globalen Variablen und Klassenvariablen. Ohne Finalize gibtsn MemoryLeak. Mit gibts keins.
@Guido Eisenbeis:
FillChar bewirkt schon, dass die Strings leer sind (leer darum, weil der Pointer zum String jetzt irgendwohin zeigt, wo kein String liegen wird). Aber wenn du das machst, musst/solltest du vorher Finalize(Record) aufrufen. Ansonsten gibt es wie...
Forum: Sonstige Fragen zu Delphi
Delphi
by Neutral General,
14. Sep 2008
Also es sieht laut FastMM4 so aus:
type
TBeweis = packed record
EinString: String;
Zahl: Integer;
end;
procedure TForm1.Button1Click(Sender: TObject);
var Beweis: TBeweis;
Forum: Sonstige Fragen zu Delphi
Delphi
by Neutral General,
14. Sep 2008
Natürlich steht dann in MyRecord.Name nichts mehr. Weil der String "genilt" wurde. Aber der String selbst liegt immernoch im Speicher rum.
Forum: Sonstige Fragen zu Delphi
Delphi
by Neutral General,
14. Sep 2008
Hi,
Ein "Beweis", dass FillChar nicht funktioniert:
type
TBeweis = packed record
EinString: String;
Zahl: Integer;
end;
Forum: Sonstige Fragen zu Delphi
Delphi
by Neutral General,
14. Sep 2008
Mh nee.. Ich glaube das siehst du richtig. Jetzt wo du's sagst... Muss man halt wirklich ne Record-Methode (seltsame Teile wie ich finde..) schreiben
Ne ist richtig :stupid: