Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Lebensdauer einer Stringlist (https://www.delphipraxis.net/186281-lebensdauer-einer-stringlist.html)

idefix2 19. Aug 2015 19:21

Lebensdauer einer Stringlist
 
Beim Programmstart erzeuge ich im Formcreate des Hauptformulars eine lokale Stringlist, die ich einer Reihe von Dropdown-Boxen als Itemliste zuordne.
Die lokale Variable vom Typ TStringlist verschwindet natürlich beim Beenden von Formcreate.
Auf diese Art produziere ich allerdings vermutlich ein Speicherleck, das sich natürlich erst beim Beenden des Programms manifestiert - bis dahin wird die Stringlist von den Dropdown-Boxen ja gebraucht - und daher nichts wirklich Böses anrichten kann.

Würdet ihr die Variable extra in den private-Bereich der Form übersiedeln, um beim Programm Beenden die Stringlist wieder freizugeben? Wäre das für irgend etwas gut?

Sir Rufo 19. Aug 2015 19:26

AW: Lebensdauer einer Stringlist
 
Keine deiner ComboBoxen braucht die nachher noch.

Du kannst die StringList beruhigt direkt in der Methode wieder freigeben.

Dejan Vu 19. Aug 2015 19:35

AW: Lebensdauer einer Stringlist
 
Speicherlecks findet man zuverlässig mit Bordmitteln und/oder FastMM, zu dessen Verwendung ich dringend rate.

Aviator 19. Aug 2015 20:15

AW: Lebensdauer einer Stringlist
 
Zitat:

Zitat von Dejan Vu (Beitrag 1312779)
Speicherlecks findet man zuverlässig mit Bordmitteln und/oder FastMM, zu dessen Verwendung ich dringend rate.

Er weiß doch woher sein Speicherleck kommt. Nur war seine Frage, wann er denn die StringList wieder freigeben kann. Da die Items aus der StringList wohl in seine ComboBoxen "kopiert" werden, braucht er die StringList nicht mehr und kann diese deshalb im FormCreate, wie von Sir Rufo bereits angemerkt, direkt wieder freigeben.

idefix2 19. Aug 2015 21:27

AW: Lebensdauer einer Stringlist
 
Ah, danke. Das war mir nicht klar.
Ich war der Meinung, die verschiedenen Comboboxen verweisen dann nur auf die eine Stringlist. Dann ist es einfach.

Verstehe ich allerdings nicht ganz, weil die Zuweisung eines TObject doch normalerweise keine Kopie anlegt, dazu ist doch "assign" notwendig (das ich nicht verwendet habe, weil ich mir gedacht habe, einmal reicht, der Inhalt wird im ganzen Programmlauf nicht mehr geändert). Warum ist das in dem Fall anders?

Sir Rufo 19. Aug 2015 21:33

AW: Lebensdauer einer Stringlist
 
Das siehst du, wenn du dir den Setter von
Delphi-Quellcode:
TComboBox.Items
anschaust.

Was finden wir da? Ein
Delphi-Quellcode:
Assign
;)

Und die Items sind sowieso keine
Delphi-Quellcode:
TStringList
, somit würde eine reine Zuweisung nicht funktionieren.

idefix2 20. Aug 2015 07:55

AW: Lebensdauer einer Stringlist
 
Zitat:

Zitat von Sir Rufo (Beitrag 1312795)
Das siehst du, wenn du dir den Setter von
Delphi-Quellcode:
TComboBox.Items
anschaust.

Was finden wir da? Ein
Delphi-Quellcode:
Assign
;)

Ein assign im Setter, das ist fies...
Der Nachteil von OOP ist wohl, dass man sich auf nichts wirklich verlassen kann.


Zitat:

Zitat von Sir Rufo (Beitrag 1312795)
Und die Items sind sowieso keine
Delphi-Quellcode:
TStringList
, somit würde eine reine Zuweisung nicht funktionieren.

Aber TStringlist ist doch Nachkomme von TStrings, so eine Zuweisung muss doch ganz normal funktionieren. Es ist doch im Gegenteil so, dass TStrings eine virtuelle Klasse ist und direkt gar nicht instanziiert werden kann (soll).

Jumpy 20. Aug 2015 08:48

AW: Lebensdauer einer Stringlist
 
Zitat:

Zitat von idefix2 (Beitrag 1312821)
Es ist doch im Gegenteil so, dass TStrings eine virtuelle Klasse ist und direkt gar nicht instanziiert werden kann (soll).

Meinst du vielleicht abstrakte (statt virtuelle) Klasse? Das sind die, die man nicht direkt erstellen kann, sondern erst die Nachfahren.

frankyboy1974 20. Aug 2015 09:43

AW: Lebensdauer einer Stringlist
 
Hallo,

es gibt in Delphi abstrakte Methoden (eine Methode die deklariert aber nicht implementiert ist). Daneben kann ich eine Methode als virtuell deklarieren (bzw. als dynamic, meint grundsätzlich das gleiche). Damit erreicht man dann polymorphes Verhalten, man deklariert in der Oberklasse eine virtuelle Methode (kann ggf. auch abstrakt sein), und in den verschiedenen Unterklassen überschreibt man dann die virtuelle Methode. Nun wird erst zur Laufzeit entschieden, wessen Methode tatsächlich ausgeführt wird (spätes Binden).

Eine Klasse die mindestens eine abstrakte Methode enthält, bezeichnet man dann gemeinhin als abstrakte Klasse. In Delphi kann man (anders als beispielsweise in Java), auch Instanzen von abstrakten Klassen erzeugen. Ruft man nun aber zur Laufzeit eine abstrakte Methode auf, erhält man eine entsprechende Fehlermeldung.

Ich wollte nur mal ein wenig klug sch.. Damit die Begrifflichkeiten, nicht ganz so durcheinander gewürfelt werden.:stupid:

mfg

frank

DeddyH 20. Aug 2015 12:39

AW: Lebensdauer einer Stringlist
 
Zitat:

Zitat von idefix2 (Beitrag 1312821)
Ein assign im Setter, das ist fies...

Ich würde eher im Gegenteil behaupten, das ist mal nachgedacht, um Dangling Pointer durch unbedachte Zuweisung zu verhindern. Und wenn man sich nicht sicher ist (oder die Sourcen nicht hat), ruft man eben selbst Assign auf.
Delphi-Quellcode:
var
  MyStrings: TStringlist;
begin
  MyStrings := TStringlist.Create;
  try
    MyStrings.Add('Eins');
    MyStrings.Add('Zwei');
    MyStrings.Add('Drei');
    SomeComboBox.Items.Assign(MyStrings);
  finally
    MyStrings.Free;
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:30 Uhr.
Seite 1 von 3  1 23      

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