Delphi-PRAXiS
Seite 4 von 9   « Erste     234 56     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Record zurücksetzen (löschen) (https://www.delphipraxis.net/120638-record-zuruecksetzen-loeschen.html)

Apollonius 14. Sep 2008 13:29

Re: Record zurücksetzen (löschen)
 
@SubData: Die Hilfe hilft:
Zitat:

Dynamic variables that are ordinarily managed by the compiler (long strings, wide strings, dynamic arrays, variants, and interfaces) can be declared with threadvar, but the compiler does not automatically free the heap-allocated memory created by each thread of execution. If you use these data types in thread variables, it is your responsibility to dispose of their memory from within the thread, before the thread terminates.

SubData 14. Sep 2008 13:32

Re: Record zurücksetzen (löschen)
 
Weiß ich, hab ich danach auch gelesen.

Neutral General 14. Sep 2008 13:33

Re: Record zurücksetzen (löschen)
 
Zitat:

Zitat von Popov
Zitat:

Zitat von Guido Eisenbeis
Was aber machst du, wenn, wie oben beschrieben, dein Record noch andere Records enthält?

Wird nur etwas länger.

Delphi-Quellcode:
Finalize(Record);
FillChar(Record,SizeOf(TRecord),0);
Ist die ultimative Lösung :mrgreen: Damit werden auch Subrecords aufgeräumt. Habs ausprobiert.

Guido Eisenbeis 14. Sep 2008 13:37

Re: Record zurücksetzen (löschen)
 
Zitat:

Zitat von Popov
Wird nur etwas länger.

Optimist *smile* :-D


@Michael + Ronny

Danke für die Infos! Also seid ihr der Meinung, dass mit Finalize + FillChar sauber gearbeitet wird?

Guido.

SubData 14. Sep 2008 13:39

Re: Record zurücksetzen (löschen)
 
Ja :)

Und bei der Gelegenheit: FastMM
Hilft dabei Speicherlecks zu finden (Und optimiert auch gleich die Anwendung)

Guido Eisenbeis 14. Sep 2008 13:39

Re: Record zurücksetzen (löschen)
 
Zitat:

Zitat von Neutral General
Delphi-Quellcode:
Finalize(Record);
FillChar(Record,SizeOf(TRecord),0);
Ist die ultimative Lösung :mrgreen: Damit werden auch Subrecords aufgeräumt. Habs ausprobiert.

Danke! Ich wollte diesbezüglich auch gerade Tests durchführen. Hast du mir erspart! *freu*

Guido.

Neutral General 14. Sep 2008 13:57

Re: Record zurücksetzen (löschen)
 
Hi,

In den neueren Delphiversionen kann mans noch in eine Methode packen. Ist dann nachher etwas bequemer:

Delphi-Quellcode:
type
  TRecord = record
    // ...
    procedure Clear;
  end;

procedure TRecord.Clear;
begin
  Finalize(Self);
  FillChar(Self,SizeOf(Self),0);
end;
Edit: Schade, dass es keine Vererbung bei Records gibt, sonst hätte man da was TObject-mäßiges bauen können :stupid:

Popov 14. Sep 2008 14:16

Re: Record zurücksetzen (löschen)
 
Zitat:

Zitat von Neutral General
Delphi-Quellcode:
Finalize(Record);
FillChar(Record,SizeOf(TRecord),0);

Also funktionieren tut es ja, aber ist das auch sauber? Also ich hab mich schon lange nicht mehr mit dem inneren Aufbau der Variablen beschäftigt, aber wie lang ist ein String im Speicher? Also "Hallo" dürfte 5 Zeichen lang sein und ist es nicht so, daß die Länge 5 auch vermerkt wird? Wenn ich sie nun auf 0 stelle, kürze ich die zwar, hinterlasse aber, zwar genullten Bereich, aber immerhin, im Speicher.

Wie gesagt, interessiert mich nur etwas. Kann auch falsch sein.

Popov 14. Sep 2008 14:17

Re: Record zurücksetzen (löschen)
 
Zitat:

Zitat von Neutral General
Edit: Schade, dass es keine Vererbung bei Records gibt, sonst hätte man da was TObject-mäßiges bauen können :stupid:

Wieso nicht gleich eine Klasse?

Neutral General 14. Sep 2008 14:31

Re: Record zurücksetzen (löschen)
 
Zitat:

Zitat von Popov
Zitat:

Zitat von Neutral General
Delphi-Quellcode:
Finalize(Record);
FillChar(Record,SizeOf(TRecord),0);

Also funktionieren tut es ja, aber ist das auch sauber? Also ich hab mich schon lange nicht mehr mit dem inneren Aufbau der Variablen beschäftigt, aber wie lang ist ein String im Speicher? Also "Hallo" dürfte 5 Zeichen lang sein und ist es nicht so, daß die Länge 5 auch vermerkt wird? Wenn ich sie nun auf 0 stelle, kürze ich die zwar, hinterlasse aber, zwar genullten Bereich, aber immerhin, im Speicher.

Wie gesagt, interessiert mich nur etwas. Kann auch falsch sein.

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:
Delphi-Quellcode:
// EinString = 'Test';
procedure TRecord.Clear;
begin
  ShowMessage(EinString); // 'Test'
  Finalize(Self);
  ShowMessage(EinString); // ''
  FillChar(Self,SizeOf(Self),0);
end;
Damit dürften wohl alle Zweifel und Unklarheiten aus der Welt geschafft sein :)

Zitat:

Zitat von Popov
Zitat:

Zitat von Neutral General
Edit: Schade, dass es keine Vererbung bei Records gibt, sonst hätte man da was TObject-mäßiges bauen können :stupid:

Wieso nicht gleich eine Klasse?

Frag mich das nicht. Ich benutze seit einiger Zeit keine Records mehr ;) Aber würde halt Spaß machen son TRecord zu bauen :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:56 Uhr.
Seite 4 von 9   « Erste     234 56     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz