speicher beim dyn. Komponenten erstellen wird nicht wieder freigegeben
-
Hallo, folgendes:
Ich erzeuge dynamisch ein Formular, erzeuge da wiederum dynamisch diverse Komponenten und schließe nach ordnungsgemäßen delete der Komponenten(wobei ich eigentlich dachte durch Owner geht das vonselbst) das Fenster wieder.
An Action = caFree habe ich gedacht.Nichtsdestotrotz wird mit jedem Fenster öffnen der Speicherverbrauch höher(logisch), sinkt aber mit dem Schließen auch nicht wieder ab.
Wie kommt das?Ich will jetzt nicht dem kompletten Code posten, das wäre nur unübersichtlich, lade aber mal mein Versuchsprojekt zu diesem Thema als bcb6 Projekt hoch:
www.eternalreign.de/test.zipBeim öffnen des Formulars(was per Timer jede Sekunde passiert) mache ich
void __fastcall TForm2::FormCreate(TObject *Sender) { for(int i = 0;i<100;i++) { TEdit* l = new TEdit(this); l->Text = "hallo Welt";l->Parent = this;l->Left = random(this->Height);l->Top=random(this->Width); l->Visible = true; labels.push_back(l); } } beim Schließen (das per Timer automatisch nach drei Sekunden erfolgt) #include <vector> std::vector<TEdit*> labels; void __fastcall TForm2::FormClose(TObject *Sender, TCloseAction &Action) { for(int i = 0; i < labels.size(); i++) { delete labels[i]; } Action = caFree; }Wär echt heldenhaft wenn da mal jemand einen Hinweis hat, irgendwie habe ich das Problem jetzt umzingelt aber es verwirrt mich trotzdem =[
-
void __fastcall TForm2::FormCreate(TObject *Sender) { for(int i = 0;i<100;i++) { labels.push_back(new TEdit(this)); labels[i]->Text = "hallo Welt";labels[i]->Parent=this;labels[i]->Left = random(this->Height);labels[i]->Top=random(this->Width); labels[i]->Visible = true; } } beim Schließen (das per Timer automatisch nach drei Sekunden erfolgt) #include <vector> std::vector<TEdit*> labels; void __fastcall TForm2::FormClose(TObject *Sender, TCloseAction &Action) { for(int i = 0; i < labels.size(); i++) { delete labels[i]; } Action = caFree; }
-
solange du den vector nicht wieder verkleinerst, behält der doch seine grösse und eine delete labels[i] löscht zwar das edit aber nicht den zeiger darauf und die grösse des vektors wird schon gar nicht geändert, d.h. fuer jedes edit das du erzeugst benötigst du 4byte speicher fuer den zeiger darauf.
hab allerdings vom std::vector keine ahnung.

-
Hallo
ich schließe mich Sunday an. Du brauchst nicht die Labels selber löschen, das macht der Owner, das Form.
Sondern du must stattdessen die Elemente (Pointer auf Forms) des vectors noch löschenlabels.clear();Das sollte dein vermeintliches Speicherloch sein.
Dies ist aber nur wirklich ein Problem, wenn du in dem Programm das Form mehrmals aufrufst. vector hat nämlich die Eigenschaft, nach seiner Lebenszeit selber alle Elemente (Achtung nicht die Instanzen auf die die Elemente zeigen) zu löschen.Ich empfehle dir den vector zusätzlich als Member des Forms zu deklarieren. Dann ist das ganz sauber.
bis bald
akari
-
Hm danke, hab das Testprogramm zu schnell programmiert

Im eigentlichen Programm ist der Vector in der Klasse und nicht extern, das heisst das Speicherloch ist doch woanders... verdammt =[.
Ich frage mich nur wieso der nicht früher, also nach dem zweiten Formular abgeschmiert ist, hab so doch jedesmal delete von jedem Element aller Fenster aufgerufen, also auch von welchen die schon gar nicht mehr existieren weil geschlossen bzw schon deletet.