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.zip

    Beim ö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öschen

    labels.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.


Anmelden zum Antworten