dummer std::vector Fehler



  • Ich weiß ja nicht, was du (ihr) sehen wollt.

    Vertices werden so gelesen:

    if(!pFile->read(reinterpret_cast<char*>(&w), sizeof(WORD)))
    				ERROR_MESSAGE("!pFile->read", -1);
    
    			m_Vertices.resize(w);
    
    			for(unsigned int iVertex = 0; iVertex < w; iVertex++)
    			{
                    if(!pFile->read(reinterpret_cast<char*>(&m_Vertices[w].m_p.x), sizeof(float)))
    					ERROR_MESSAGE("!pFile->read", -1);
    
    				if(!pFile->read(reinterpret_cast<char*>(&m_Vertices[w].m_p.z), sizeof(float)))
    					ERROR_MESSAGE("!pFile->read", -1);
    
    				if(!pFile->read(reinterpret_cast<char*>(&m_Vertices[w].m_p.y), sizeof(float)))
    					ERROR_MESSAGE("!pFile->read", -1);
    			}
    

    Faces nach dem gleichen Prinzip. Mehr ist das nicht...

    Und das mit dem Memory habe ich auch schon gesehen. Was mich aber verwirrt, es ist ja gar nicht so viel Speicher, was ich da reserviere. Und ausserdem funktionieren alle anderen Pogramme und Spiele (die bis zu 140 MB speicher reservieren) problemlos. Ausserdem habe ich 512MB Ram. Also da sollte nicht das Problem liegen...

    Ich hoffe auf Hilfe,

    vielen Dank,

    Chrissi



  • @Shlo:

    new das von std::vector intern verwendet wird, wirft std::bad_alloc. Ist also kein dummer std::vector Fehler, sonder deins von EH kein Gebrauch zu machen...

    😕

    Was ist EH???

    Vielen Dank,

    Chrissi



  • EH = Exception Handling = try/catch
    Darauf solltest du bzw. dein Program vorbereitet sein. Wenn deinem Programm der Speicher ausgeht hast entweder einge dicke (Speicher-) Leichen im Keller oder mindestens einen groben konzeptionellen Fehler.

    mfg JJ



  • ~chrissi schrieb:

    @Shlo:

    new das von std::vector intern verwendet wird, wirft std::bad_alloc. Ist also kein dummer std::vector Fehler, sonder deins von EH kein Gebrauch zu machen...

    😕

    Was ist EH???

    Vielen Dank,

    Chrissi

    Ich vermute er meint Exceptionhandling; und bezieht sich da auf die nichtgefangene Ausnahme des Typs std::bad_alloc.

    //Edit too late



  • Ich weiß nicht, aber so viel Speicher nutze ich doch gar nicht.

    Es wird bis zu dem Fehler nur einmal new genutzt, und das wird auch schön gedelted. Zusätzlich habe ich so bei meiner Anwendung nach Task_Manager 8MB Speicher reserviert (Mit D3D-Device + Fenster) und beim Fehler (also beim Exporter) 11 MB, wo andere Anwendungen 172 MB reservieren.

    Wo kann ich sehen, wie viel Speicher meiner Anwendung zusteht, und welche Variable wie viel verbraucht???

    Ich hoffe immer noch auf Hilfe,

    Cu,

    Chrissi



  • Bau halt einfach mal um das ganze Programm ein

    try
    {
      // Dein main-Code hier
    }
    catch(std::bad_alloc)
    {
      // Meldung für bad_alloc ausgeben
    }
    catch(...)
    {
      // Meldung für unbekannten Fehler ausgeben
    }
    

    Dann siehst Du was er sagt.



  • Hi,

    bad_alloc ist es nicht. Es ist irgendeine andere Ausnahme. Welche anderen Ausnahmen könnte ich denn noch so behandeln??? Gibt es irgendwo eine Liste der Ausnahmen???

    Vielen Dank,

    Chrissi



  • Ausnahmen sollte man per Referenz fangen, zumal wenn es um Ausnahmen der Standardbibliothek handelt.

    try { /*...*/ }
    catch (const std::bad_alloc&) { }
    catch (std::exception&) { }
    catch (...) { /* alles andere */ }
    


  • Also,
    ich habe jetzt diese lange liste von Ausnahmen abgefangen, ohne Erfolg:

    try
    {
                    m_Vertices.resize(w); 
    }
                                catch(bad_alloc) 
    			{ 
    				ERROR_MESSAGE("m_Faces.resize: bad_alloc", -1);
    			}
    			catch(bad_cast)
    			{ 
    				ERROR_MESSAGE("m_Faces.resize: bad_cast", -1);
    			}
    			catch(bad_typeid)
    			{ 
    				ERROR_MESSAGE("m_Faces.resize: bad_typeid", -1);
    			}
    			catch(out_of_range)
    			{ 
    				ERROR_MESSAGE("m_Faces.resize: out_of_range", -1);
    			}
    			catch(range_error)
    			{ 
    				ERROR_MESSAGE("m_Faces.resize: out_of_range", -1);
    			}
    			catch(overflow_error)
    			{ 
    				ERROR_MESSAGE("m_Faces.resize: overflow_error", -1);
    			}
    			catch(underflow_error)
    			{ 
    				ERROR_MESSAGE("m_Faces.resize: underflow_error", -1);
    			}
    			catch(invalid_argument)
    			{ 
    				ERROR_MESSAGE("m_Faces.resize: invalid_argument", -1);
    			}
    			catch(ios_base::failure)
    			{ 
    				ERROR_MESSAGE("m_Faces.resize: ios_base::failure", -1);
    			}
    			catch(bad_exception)
    			{ 
    				ERROR_MESSAGE("m_Faces.resize: bad_exception", -1);
    			}
    			catch(domain_error)
    			{ 
    				ERROR_MESSAGE("m_Faces.resize: domain_error", -1);
    			}
    			catch(...)
    			{ 
    				ERROR_MESSAGE("m_Faces.resize", -1); 
    			}
    

    Auch mit Shlos Trick ist nichts dabei.

    😡

    Mhhhhhhh,

    ich hoffe auf Hilfe,

    Chrissi



  • Hi,

    das ganze wird noch mysteriöser (oder ich bin einfach zu beschränkt, den Fehler zu finden).

    Ich lasse das einfach mit dem Lesen der Modell-Daten-Chnuks, überspringe sie alle und schreibe aber dafür:

    m_Vertices.resize(9999);
    	m_Faces.resize(9999);
    

    am anfang meienr Funktion. Und, siehe da, es Funktioniert. Genug Speicher habe ich wohl.

    Naja, ich werde wohl mal den ganzen Code posten müssen.

    Gute Nacht,

    Chrissi



  • Was für einen Wert hat denn w, wenn du es vor dem resize irgendwie ausgibst (guter Debugger hilft)? Ich würde einfach mal tippen, dass da irgendein falscher Müll drin steht, warum auch immer (Datei kaputt, w kein WORD usw.).


Anmelden zum Antworten