Speicher wieder freigeben von zur Laufzeit erzeugtem Array von Komponenten
-
Hi,
hab mal ne Frage zum Speicheraufräumen. Wenn ich zur Laufzeit mehrere TLabels oder andere Komponenten mit new erzeuge, muss ich dann einen eigenen Destructor anlegen in dem ich diese Komponenten beim Schließen oder Verlassen des Formulars explizit lösche, oder wird das Löschen und Freigeben vom Speicher automatisch gemacht ?
*.h
// ... public: // Benutzer-Deklarationen TLabel *lblModelType[5]; // ...
*.cpp
for ( int i = 0, j = 30; i < 5; ++i, j += 20 ) { lblModelType[i] = new TLabel(this); lblModelType[i]->Parent = GroupBox6; lblModelType[i]->Left = 38; lblModelType[i]->Top = j; lblModelType[i]->Height = 13; lblModelType[i]->AutoSize = true; }
-
Hallo,
da du beim Konstruktor einen Owner (this, d.h. die Form) angegeben hast, brauchst du dich selber um die Freigabe nicht zu kümmern, da beim Schließen (bzw. im Destruktor) der Form implizit alle untergeordneten Controls gelöscht werden.
Nur wenn du keinen Parameter im Konstruktor angeben würdest, d.h.new TLabel()
wärst du selber für die Verwaltung (Freigabe) zuständig.
-
Th69 schrieb:
Nur wenn du keinen Parameter im Konstruktor angeben würdest
[BCC32 Error] E2285 Could not find a match for 'TLabel::TLabel()'
Du meinst sicher sowas wie new TLabel(NULL).
-
Hi Th69,
danke für die Hilfe !
-
Hallo Jansen,
ups - ja ich meinte NULL als Parameter (ein Standardparameter wird ja nicht unterstützt, da dies ja ein Delphi-Erbe ist).
-
Th69 schrieb:
ups - ja ich meinte NULL als Parameter (ein Standardparameter wird ja nicht unterstützt, da dies ja ein Delphi-Erbe ist).
Delphi unterstützt Standardparameter.
-
Hallo audacia,
aber wohl erst seit Delphi 4 (und die erste C++ Builder-Version basiert ja auf Delphi 1 bzw. die 32-Bit auf Delphi 3). Und seitdem hat sich die Signatur der bestehenden Methoden der Standard-Komponenten in der VCL ja nicht verändert. Neue sind selbstverständlich hinzugekommen, but as far as I know, bieten auch die aktuellen VCL-Methoden keine Standardparameter an (sondern dies wird generell über Methodenüberladungen gelöst).
-
Th69 schrieb:
aber wohl erst seit Delphi 4 (und die erste C++ Builder-Version basiert ja auf Delphi 1 bzw. die 32-Bit auf Delphi 3).
Stimmt, das kann sein. Dennoch ist es natürlich kein Hindernis, für den Parameter nachträglich einen Standardwert anzugeben, wenn man dies für sinnvoll erachtet hätte. Und offenbar hielt man es für sinnvoll, wenn der Komponentenbenutzer in jedem Fall gezwungen wird, kurz über die Besitztumsfrage nachzudenken und ggf. explizit eine 0 zu übergeben.