Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Im Class Destructor alle Strings leer (https://www.delphipraxis.net/162006-im-class-destructor-alle-strings-leer.html)

Björn Ole 2. Aug 2011 02:55


Im Class Destructor alle Strings leer
 
Ist wahrscheinlich einfach nur zu spät für mich, aber ich kann sonst nicht einschlafen.
Folgende Klasse:
Delphi-Quellcode:
TStatic = class
private
  class var FInt: integer;
  class var FStr: string;
  class constructor Create;
  class destructor Destroy;
public
  class procedure ShowMe;
end;
Und folgende Anwendung mit einem TButton auf dem Formular:
Delphi-Quellcode:
{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
  TStatic.ShowMe; // Ausgabe: "7Hallo" - GUT!
end;

{ TStatic }

class constructor TStatic.Create;
begin
  FStr := 'Hallo';
  FInt := 7;
  TStatic.ShowMe; // Ausgabe: "7Hallo" - GUT!
end;

class destructor TStatic.Destroy;
begin
  TStatic.ShowMe; // Ausgabe: "7 " - WARUM?
end;

class procedure TStatic.ShowMe;
begin
  ShowMessage(IntToStr(FInt) + FStr);
end;
Es kompiliert und gibt keine Warnungen, aber warum kennt der Destruktor meinen String nicht mehr und wie kann ich korrekt auf ihn zugreifen? :(

FredlFesl 2. Aug 2011 06:38

AW: Im Class Destructor alle Strings leer
 
Schätze mal, der String ist schon futsch d.h. freigegeben.

Peter1999 2. Aug 2011 07:45

AW: Im Class Destructor alle Strings leer
 
Hallo,

ich habe zwar denn Sinn eines Class Constructors (erst recht eines Class Destructors) noch nicht ganz verstanden, aber hier stehen zumindest ein paar Regeln, die man beachten soll:

"You do not have to declare a class destructor if you declare a class constructor, and vice versa."
"They do not have to be called Create and Destroy."

Dafür wird es schon Gründe geben.

ventiseis 2. Aug 2011 07:46

AW: Im Class Destructor alle Strings leer
 
Ist so gewollt.

Siehe:

himitsu 2. Aug 2011 08:08

AW: Im Class Destructor alle Strings leer
 
Ist leider alles noch etwas "verbugt", bzw. blöde geplant.

Sei froh, daß der Destructor in deinem 2010 überhaupt aufgerufen wird.
(Anfangs hatte man es glatt vergessen)

Wobei es hier einen Hack gibt, denn wie man an FInt sieht, sind Pointer davon natürlich nicht betroffen.
(ein PString + NewStr)

Björn Ole 2. Aug 2011 20:04

AW: Im Class Destructor alle Strings leer
 
Danke für eure Antworten.

@Peter1999, die beiden genannten Hinweise haben nichts mit meinem Problem zu tun. Trotzdem gut zu wissen. :stupid:

Hm, das ist natürlich unvorteilhaft, dass das so by-Design ist.
Ändere ich aber
Delphi-Quellcode:
FStr: string;
zu
Delphi-Quellcode:
FStr: PChar;
funktioniert es, ein
Delphi-Quellcode:
ReportMemoryLeaksOnShutdown := true;
zeigt keine Meldungen. Spricht was dagegen?

himitsu 2. Aug 2011 20:33

AW: Im Class Destructor alle Strings leer
 
Zitat:

Zitat von Björn Ole (Beitrag 1114800)
Spricht was dagegen?

nö :roll:

Kommt aber drauf an, wie/was du mit diesem PChar gemacht hast.

FredlFesl 3. Aug 2011 06:03

AW: Im Class Destructor alle Strings leer
 
Das das 'by Design' ist, ist doch krank.
Ich habe im Instanz-Destruktor doch auch noch Zugriff auf die Feldinhalte, wieso sollte das bei einem Class Destructor nicht so sein?


Alle Zeitangaben in WEZ +2. Es ist jetzt 02:44 Uhr.

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