Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi FreeAndNil() auf Array anwenden? (https://www.delphipraxis.net/83567-freeandnil-auf-array-anwenden.html)

Balu der Bär 4. Jan 2007 17:08


FreeAndNil() auf Array anwenden?
 
Moin,

ich bin anscheinend etwas verwirrt heute...

Wieso ist es mir möglich ein Array mittels FreeAndNil() zu leeren, oder jedenfalls diesen Befehl auf ein Array anzuwenden? Laut Delphi-Hilfe muss der übergebene Wert eine Instanz einer von TObject abgeleiteten Klasse sein.
Ein Array ist eine Instanz von TObject? Inwieweit das? :gruebel:

Ich kam darauf da ein Bekannter mich fragte wieso bei ihm nach der Anwendung von FreeAndNil() auf ein Array manchmal sporadisch Fehlermeldungen auftraten. Was macht als FreeAndNil() mit dem Array, einfach nur dessen Inhalt löschen?

*confused*

St.Pauli 4. Jan 2007 17:31

Re: FreeAndNil() auf Array anwenden?
 
Also bei mir klappt es nicht FreeAndNil() auf ein Array anzuwenden. :mrgreen:
Hat er dich gefragt, warum manchmal Fehler auftreten, oder warum immer Fehler auftreten? Weil ein manchmal würde mich stark verwundern...

Balu der Bär 4. Jan 2007 17:33

Re: FreeAndNil() auf Array anwenden?
 
Ja, es treten manchmal (sporadisch) Fehler auf (Zugriffsverletzung beim Lesen von 0000000A), manchmal klappt aber eben alles.

Delphi-Quellcode:
test: array of String;

...

test[1] := 'mööp';
FreeAndNil(test);
Klappt bei mir. :gruebel:

inherited 4. Jan 2007 17:34

Re: FreeAndNil() auf Array anwenden?
 
Ist es denn ein dynamisches oder ein statisches Array?
€dit: Roter Kasten, ich vermisse dich -.-

Khabarakh 4. Jan 2007 18:10

Re: FreeAndNil() auf Array anwenden?
 
Schaut euch doch einfach mal den Code an :P .
Delphi-Quellcode:
procedure FreeAndNil(var Obj); // <- untypisiert
var
  Temp: TObject;
begin
  Temp := TObject(Obj); // <-- pitterpöser Cast
Das wird zu 99% schiefgehn. Umso schlimmer, wenn es dann keine AV gibt.
Fragt sich nur, warum der Parameter untypisiert ist ;) .

Balu der Bär 4. Jan 2007 18:14

Re: FreeAndNil() auf Array anwenden?
 
Nein, das eigentliche FreeAndNil(array) geht niemals schief. Nur beim späteren Arbeiten mit dem Array (z.B. Nachfüllen von Daten) kommt es halt in unregelmäßigen Abständen zu Fehlern.

inherited 4. Jan 2007 18:48

Re: FreeAndNil() auf Array anwenden?
 
Warum nicht einfach mit SetLength die Größe auf 0 setzen?

Elvis 4. Jan 2007 18:49

Re: FreeAndNil() auf Array anwenden?
 
Zitat:

Zitat von Khabarakh
Das wird zu 99% schiefgehn.

:shock: Auf einen Array angewendet sollte das zu 100% schiefgehen.
Schreib dir doch einen Overload zu FreeAndNil für dyn. Arrays. Falls du es gar zu dringend vermisst. :mrgreen:

Mr_G 4. Jan 2007 19:01

Re: FreeAndNil() auf Array anwenden?
 
Also ich dachte immer, dass FreeAndNil eine Kombination aus ".Free" und ":= nil" sein soll (was es scheinbar auch ist):
Delphi-Quellcode:
ObjectX.Free;
ObjectX := nil;
//oder:
FreeAndNil(ObjectX);
Daher wäre ich irgendwie sowieso nie auf die Idee gekommen das auf ein Array (Array <> Objekt) anzuwenden.

Zitat:

Zitat von Balu der Bär
Nein, das eigentliche FreeAndNil(array) geht niemals schief. Nur beim späteren Arbeiten mit dem Array (z.B. Nachfüllen von Daten) kommt es halt in unregelmäßigen Abständen zu Fehlern.

Also wenn ich FreeAndNil nutze (wenn auch nicht für Arrays ;)), dann doch um Speicher freizugeben. Das es danach zu Fehlern kommen muss wenn man versucht auf das Objekt (in diesem Fall ja Array) zuzugreifen ist doch logisch, oder? :gruebel:

Balu der Bär 4. Jan 2007 19:06

Re: FreeAndNil() auf Array anwenden?
 
Zitat:

Zitat von Mr_G
Das es danach zu Fehlern kommen muss wenn man versucht auf das Objekt (in diesem Fall ja Array) zuzugreifen ist doch logisch, oder? :gruebel:

Naja wenn ich ein Objekt nach FreeAndNil wieder erstelle, kann ich auch wieder damit arbeiten. ;)

Aber es ging wie gesagt nicht um mich, wenn mich jemand solche Sachen fragt die ich selber nicht weiß muss halt die DP ran. Ich werde ihm also raten das Array anders zu leeren, ohne FreeAndNil. ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:11 Uhr.
Seite 1 von 2  1 2      

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