![]() |
Generics - Memory Leak wenn constructor ohne inherited Create
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:
Nachdem ich dann das inherited; auf inherited Create; geändert hatte waren meine "Speicherlöcher" weg...
constructor TMyItems.Create;
begin inherited; end; Woran liegt das? Ich dachte das die Angabe von inherited ausreichend ist... Oder bin ich da heut gedanklich auf dem Holzweg? |
AW: Generics - Memory Leak wenn constructor ohne inherited Create
Das bringt immer wieder die armen Benutzer von
Delphi-Quellcode:
bzw.
TList<T>
Delphi-Quellcode:
zur Verzweiflung.
TObjectList<T>
Wenn du in deinem parameterlosen Konstruktor Create einfach sagst
Delphi-Quellcode:
dann ruft er den parameterlosen Konstruktor der Oberklasse auf.
inherited
Schau mal: Hat
Delphi-Quellcode:
denn einen? Nein, hat es nicht! Es hat einen mit einem Parameter den man weglassen kann. Wenn du sagst
TObjectList<TMyItem>
Delphi-Quellcode:
dann füllt der Compiler den optionalen Parameter für dich aus und der richtige Konstruktor mit dem optionalen Parameter wird aufgerufen.
inherited Create()
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 |
AW: Generics - Memory Leak wenn constructor ohne inherited Create
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? |
AW: Generics - Memory Leak wenn constructor ohne inherited Create
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 ![]() ![]() ![]() |
AW: Generics - Memory Leak wenn constructor ohne inherited Create
Dann stimmt doch mal fleissig hierfür:
![]() Falls man den Report noch verbessern kann einfach hier melden... |
AW: Generics - Memory Leak wenn constructor ohne inherited Create
Zitat:
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. |
AW: Generics - Memory Leak wenn constructor ohne inherited Create
Zitat:
![]() |
AW: Generics - Memory Leak wenn constructor ohne inherited Create
Und genau deshalb hat man sich damals bei C# entschieden, dass Konstruktoren nicht vererbt werden.
|
AW: Generics - Memory Leak wenn constructor ohne inherited Create
Vielen Dank für die Erklärungen und Links :thumb:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz