Speicher läuft voll



  • Danke Euch Beiden.

    Jochen Kalmbach schrieb:

    Du solltest das vorherige Image disposen...

    Und wie mache ich das richtig?
    Das habe ich versucht:

    Image::FromFile(dia_file[dia-1])->Dispose();
    

    Dispose wird mir auch als Befehl angeboten, dennoch kommt immer dieser Fehler:

    Fehler	1	error C2039: 'Dispose': Ist kein Element von 'System::Drawing::Image'
    


  • Na dann wende doch delete an.



  • witte schrieb:

    Na dann wende doch delete an.

    Funktioniert auch nicht.

    Versuch 1:

    if (dia>0) delete Image::FromFile(dia_file[dia-1]);
    
    this->BackgroundImage = nullptr;				 
    this->BackgroundImage = Image::FromFile(dia_file[dia]);
    

    Versuch 2:

    this->BackgroundImage = nullptr;				 
    this->BackgroundImage = Image::FromFile(dia_file[dia]);
    delete Image::FromFile(dia_file[dia]);
    

    Der Speicher läuft immer noch voll.



  • Noch ein Versuch:

    if (this->imagefile){
      delete this->BackgroundImage;
      delete this->imagefile;
    }
    this->imagefile = Image::FromFile(dia_file[dia]);
    this->BackgroundImage = imagefile;
    

    Ich kann noch soviel suchen und googlen, finde einfach keine Lösung. Stundenlang knöstere ich hier jetzt schon rum und komme einfach nicht weiter, der Speicher läuft voll. Macht so keinen Spaß, irgendwas ist faul. 😞



  • GC::Collect();
    


  • Champ II schrieb:

    GC::Collect();
    

    Vielen Dank, das hilft. 👍



  • uwe_2 schrieb:

    witte schrieb:

    Na dann wende doch delete an.

    Funktioniert auch nicht.

    Versuch 1:

    if (dia>0) delete Image::FromFile(dia_file[dia-1]);
    
    this->BackgroundImage = nullptr;				 
    this->BackgroundImage = Image::FromFile(dia_file[dia]);
    

    Versuch 2:

    this->BackgroundImage = nullptr;				 
    this->BackgroundImage = Image::FromFile(dia_file[dia]);
    delete Image::FromFile(dia_file[dia]);
    

    Der Speicher läuft immer noch voll.

    Wenn schon, dann so (dein Code macht nicht das was Du denkst):

    delete this->BackgroundImage;
    

    Ausserdem würde ich den GC seine Arbeit machen lassen und GC::Collect(..) nicht benutzen. Das ist eher kontra- produktiv.

    Simon



  • theta schrieb:

    Wenn schon, dann so (dein Code macht nicht das was Du denkst):

    delete this->BackgroundImage;
    

    Ausserdem würde ich den GC seine Arbeit machen lassen und GC::Collect(..) nicht benutzen. Das ist eher kontra- produktiv.

    Simon

    Schau mal in Versuch 3:

    if (this->imagefile){
      delete this->BackgroundImage;
      delete this->imagefile;
    }
    this->imagefile = Image::FromFile(dia_file[dia]);
    this->BackgroundImage = imagefile;
    

    Da habe ich das schon angewendet und es funkioiert nicht, der Speicher läuft immer voller, bis nichts mehr geht.

    GC::Collect(..) funkioniert, warum ist das kontraproduktiv?
    Was kann ich stattdessen noch machen?



  • Ja, in Versuch 3 tust du zweimal daselbe objekt disposen. Auch nicht super.

    In den meisten Fällen kann gesagt werden, wenn Du denkst GC::Collect(..) hilft Dir, dann hast Du sonst wo ein Problem.

    Simon



  • Selbstverständlich habe ich die beiden Befehle auch einzeln probiert.
    Als es immer noch nicht klappen wollte, habe ich einfach mal beide benutzt.

    Was kann denn GC::Collect(..) anrichten?

    Wie kann ich den Speicher sonst freigeben, wenn delete einfach nicht greifen will?
    Mich interessiert auch, warum das nicht greift, den Befehl gibt es ja und ausgeführt wird er auch. Nur den Speicher interessiert das nicht.



  • Da habe ich das schon angewendet und es funkioiert nicht, der Speicher läuft immer voller, bis nichts mehr geht.

    Was bedeutet das? Gibt es eine Exception? Stürzt das Programm ab? Reagiert es nicht mehr?
    Und wie misst Du den Memory Verbrauch? (Auch über längere Zeit?)

    Simon



  • theta schrieb:

    Da habe ich das schon angewendet und es funkioiert nicht, der Speicher läuft immer voller, bis nichts mehr geht.

    Was bedeutet das? Gibt es eine Exception? Stürzt das Programm ab? Reagiert es nicht mehr?
    Und wie misst Du den Memory Verbrauch? (Auch über längere Zeit?)

    Simon

    Über den Taskmanager in Win lass ich mir den Speicher anzeigen. Ich benutze große Bilder und da dauert es nicht lange bis der Speicher randvoll ist.
    Dann bricht das Programm natürlich ab: Nicht genügend Speicher.



  • uwe_2 schrieb:

    Was kann denn GC::Collect(..) anrichten?

    Dein Programm langsam machen.

    Wie kann ich den Speicher sonst freigeben, wenn delete einfach nicht greifen will?

    delete greift schon. Vermutlich dispos'd du einfach irgendwas nicht, was disposed werden sollte.

    Die .NET Runtime triggert nämlich selbst eine Collection wenn kein Speicher mehr da ist. Erst wenn die Collection nix gebracht hat, wir "out of memory" geworfen.



  • hustbaer schrieb:

    delete greift schon. Vermutlich dispos'd du einfach irgendwas nicht, was disposed werden sollte.

    Genau das wars. Ich hatte die size Informationen ebenfalls immer mit Image::FromFile.... abgerufen, dachte es würden nur Zahlen übegeben.
    Im Nachhinein klar: Das Bild wird trotzdem in den Speicher geladen.

    Das habe ich nun gerichtet und es läuft zu meiner Zufriedenheit.

    So sieht der Code nun aus:

    imagefile=Image::FromFile(dia_file[dia]);
    int w_dia = imagefile->Size::get().Width;
    int h_dia = imagefile->Size::get().Height;
    int w_screen = Size::get().Width;
    int h_screen = Size::get().Height;
    
    if (w_dia > w_screen || h_dia > h_screen){
       this->BackgroundImageLayout = System::Windows::Forms::ImageLayout::Zoom;
    }else{
       this->BackgroundImageLayout = System::Windows::Forms::ImageLayout::Center;
    }
    delete this->BackgroundImage;
    this->BackgroundImage = imagefile;				 
    dia++;
    

    Vielen Dank für Eure Hilfe und Geduld.


Anmelden zum Antworten