AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Generics - Memory Leak wenn constructor ohne inherited Create
Thema durchsuchen
Ansicht
Themen-Optionen

Generics - Memory Leak wenn constructor ohne inherited Create

Ein Thema von Cashew · begonnen am 8. Mär 2019 · letzter Beitrag vom 12. Mär 2019
Antwort Antwort
Cashew

Registriert seit: 15. Mär 2017
24 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#1

Generics - Memory Leak wenn constructor ohne inherited Create

  Alt 8. Mär 2019, 17:25
Hallo zusammen,

ich denk mal dass die Klassenstruktur aus dem folgenden Beispielgängige Praxis ist:

Delphi-Quellcode:
  { TMyItem }
  //----------------------------------------------------------------------------
  TMyItem = class
  private
    FInfo : string;
  public
    constructor Create;
    destructor Destroy; override;
    property Info : string read FInfo write FInfo;
  end;

  { TMyItems }
  //----------------------------------------------------------------------------
  TMyItems = class (TObjectList<TMyItem>)
  public
    constructor Create;
    destructor Destroy; override;
    procedure AddItem(const AValue:TMyItem);
  end;

Ich habe heute in meinem Programm, in der *.dpr Datei die Option ReportMemoryLeaksOnShutdown eingeschaltet. Und habe beim Schließen der Anwendung dann die Info bekommen, das ich "Speicherlöcher" habe... Hervorgerufen durch nicht freigegebene TMyItem Instanzen...

Ich bin dann darauf gekommen, dass der Fehler an meinem constructor von der Klasse TMyItems liegt. Denn hatte ich wie folgt implementiert:

Delphi-Quellcode:
constructor TMyItems.Create;
begin
  inherited;
end;
Nachdem ich dann das inherited; auf inherited Create; geändert hatte waren meine "Speicherlöcher" weg...

Woran liegt das? Ich dachte das die Angabe von inherited ausreichend ist... Oder bin ich da heut gedanklich auf dem Holzweg?
What goes arround, comes arround
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.159 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Generics - Memory Leak wenn constructor ohne inherited Create

  Alt 8. Mär 2019, 18:53
Das bringt immer wieder die armen Benutzer von TList<T> bzw. TObjectList<T> zur Verzweiflung.

Wenn du in deinem parameterlosen Konstruktor Create einfach sagst inherited dann ruft er den parameterlosen Konstruktor der Oberklasse auf.


Schau mal: Hat TObjectList<TMyItem> denn einen? Nein, hat es nicht! Es hat einen mit einem Parameter den man weglassen kann. Wenn du sagst inherited Create() dann füllt der Compiler den optionalen Parameter für dich aus und der richtige Konstruktor mit dem optionalen Parameter wird aufgerufen.

Der Konstruktor mit "wirklich keine Parameter" ist der von TObject. Definitiv der falsche.


Das Problem manifestiert sich auch an ganz anderen Stellen (z.B. wenn du eine TList<T> de-serialisieren willst), es wurde schon x mal an Embarcadero herangetragen, aber die meinen alles ist as designed
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.942 Beiträge
 
Delphi 12 Athens
 
#3

AW: Generics - Memory Leak wenn constructor ohne inherited Create

  Alt 8. Mär 2019, 19:34
Hm, könnte nicht EMBT diesen TList<T> und TObjectList<T> Klassen einfach einen parameterlosen Create constructor spendieren, der intern dann denn mit dem optionalen parameter passend aufruft, falls nötig?

Wäre das ein funktionierender Lösungsansatz?
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.159 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Generics - Memory Leak wenn constructor ohne inherited Create

  Alt 8. Mär 2019, 20:02
Ohne lange drüber nachgedacht zu haben würde das sicher dieses (und andere) Probleme lösen.

Noch besser wäre es, sich Standard-Parameter abzugewöhnen. Das geben Coding-Standards wie MISRA/AUTOSAR (M8-3-1), HIC++ (Kap. 9.1.2) oder Google auch sicher nicht grundlos so vor (zumindest bei virtuellen Methoden).
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.942 Beiträge
 
Delphi 12 Athens
 
#5

AW: Generics - Memory Leak wenn constructor ohne inherited Create

  Alt 9. Mär 2019, 18:34
Dann stimmt doch mal fleissig hierfür:
https://quality.embarcadero.com/browse/RSP-23943

Falls man den Report noch verbessern kann einfach hier melden...
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.582 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Generics - Memory Leak wenn constructor ohne inherited Create

  Alt 9. Mär 2019, 20:12
Noch besser wäre es, sich Standard-Parameter abzugewöhnen. Das geben Coding-Standards wie MISRA/AUTOSAR (M8-3-1), HIC++ (Kap. 9.1.2) oder Google auch sicher nicht grundlos so vor (zumindest bei virtuellen Methoden).
Das liegt auch daran, dass diverse IDEs bzw. Texteditoren die möglichen Parameter schlechter darstellen als Delphi. In Delphi tragen Standard-Parameter eher zur Lesbarkeit bei.
Dass die Standard-Parameter je nach Überladung anders definiert sein können, ist sicher richtig, aber wenn der Parameter für den eigenen Code relevant ist, gibt man ihn ja auch an.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
703 Beiträge
 
Delphi 12 Athens
 
#7

AW: Generics - Memory Leak wenn constructor ohne inherited Create

  Alt 11. Mär 2019, 10:49

Nachdem ich dann das inherited; auf inherited Create; geändert hatte waren meine "Speicherlöcher" weg...

Woran liegt das? Ich dachte das die Angabe von inherited ausreichend ist... Oder bin ich da heut gedanklich auf dem Holzweg?
Ich bin da kürzlich in die selbe Falle reingetappt:
https://www.delphipraxis.net/199595-...inherited.html
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.016 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#8

AW: Generics - Memory Leak wenn constructor ohne inherited Create

  Alt 11. Mär 2019, 13:03
Und genau deshalb hat man sich damals bei C# entschieden, dass Konstruktoren nicht vererbt werden.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Cashew

Registriert seit: 15. Mär 2017
24 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#9

AW: Generics - Memory Leak wenn constructor ohne inherited Create

  Alt 12. Mär 2019, 08:41
Vielen Dank für die Erklärungen und Links
What goes arround, comes arround
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:18 Uhr.
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