STL List bricht das Programm nach push_back nr. ca. 1900 ab



  • Hallo,

    woran kann es liegen das meine list nur bis ca. 1900 gefüllt wird und dann das Programm einfach abbricht?

    Gruß



  • Speicher voll?

    Hör mal, du musst schon mehr Informationen liefern? Wie bricht es ab? Fehlermeldung? Wie sieht der Code aus?



  • Mein Code ist hier:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-249059.html

    Leider gibt es bei dev c++ keine fehlermeldung, das Programm bricht nach den ca. 1900. Eintrag einfach ab. 😞

    habe auch schon mit max_size() abgefragt -> 4294967295

    Ich habe in jeden List Eintrag eine struct mit 7 strings gespeichert



  • Hi,
    Melde mich interesse halber.
    Wenn es der Hauptspeicher voll ist, und du dich dafür entscheidest den allokator zu überschreiben, würd ich mich freuen, wenn du den code postest.
    Also z.b. Dass du Daten auf Festplatte auslagerst, und den Speicher wieder frei giebst.
    Gruß



  • Leider weiß ich im moment nicht woran es liegt.

    Habe es jetzt mal genauer untersucht, nach genau den 1601. Eintrag bricht das Programm ohne Fehlermeldung einfach ab...



  • Vorschlag:
    Bin mir nicht sicher ob listen bad_alloc werfen.
    Aber ich würds mal versuchen zu fangen, nur wenn dus noch nicht gemacht hast.
    Gruß



  • Ich hab den Code mal hierher geholt und formatiert.

    bool MMHV::OpenRead_File(string file_name, int &anzahl_datensaetze, list<HV_Liste_Daten> &liste)
    {    
        ifstream in(file_name.c_str());
        if(in)
        {
            while(!in.eof())
            {    
                if(++zeile > 1)
                {
                    getline(in, line_tmp);
                    tmp = Filter_Line(line_tmp);
                    liste.push_back (tmp);
                }              
            }
            anzahl_datensaetze = (int)liste.size();
            return true;
        }
        return false;
    }
    

    1. Hast du mal versucht, Filter_Line(...) einen Pointer auf die Struktur ( oder Klasse ) zurückliefern zu lassen und nur den Pointer in die Liste zu hängen.

    Wenn ich das richtig sehe liefert Filter_Line einfach nur eine Struktur zurück.

    Hier mal mit Pointerübergabe, ohne Rücklieferung.

    bool MMHV::OpenRead_File(string file_name, int &anzahl_datensaetze, list<HV_Liste_Daten> &liste)
    {    
        ifstream in(file_name.c_str());
        if(in)
        {
            while(!in.eof())
            {    
                if(++zeile > 1)
                {
                    getline(in, line_tmp);
                    HV_Liste_Daten *FooBar = new HV_Liste_Daten();
                    Filter_Line(line_tmp, FooBar );
                    liste.push_back ( FooBar );
                }              
            }
            anzahl_datensaetze = (int)liste.size();
            return true;
        }
        return false;
    }
    

    naja irgendwie so in der Richtung.
    Das bad_alloc hier fliegt halte ich für eher unwahrscheinlich, bei 7 Strings * 1600 ... da müssten die Strings schon groß sein, und der Arbeitspeicher unnormal klein oder voll, für heutige Verhältnisse.

    2. Zeile ist jetzt hier im Code nicht definiert, aber geh mal davon aus, dass dort das Problem nicht liegt.

    EDIT:

    3. Wirf DevC++ weg und nimm CodeBlocks wenn du schon unbedingt unter Windows entwickeln willst / musst 😃



  • Halte das Programm doch mal an, bevor das 1900ste push_back kommt (kannste mit einer Assertion machen) und gehe mit dem Debugger durch. Dann wirst du den Fehler schon finden.



  • Habe meinen Fehler gefunden, liegt in keinster weise an der list, sondern in der csv datei die ich auslese, dort fehlte in der 1601. zeile zum schluß ein ';'. und da ich nicht bei string.find(';') mit string::npos abgefragt habe, wird das programm beendet.

    Also, problem gelöst. 🙂

    @It0101:
    Habe ich auch probiert, aber ist ja vom prinzip das gleiche...
    rentiert sich wohl erst bei größeren strukturen, wie zum beispiel bilder, oder so.

    korrigiert mich wenn ich falsch liege.

    Danke.
    Gruß 🙂



  • Passt scho... ich machs nur immer so, dass wenn etwas nicht funzt, probier ich einen geringfügig anderen Weg. Das geht meist schnell und manchmal hilft das auch bei der Fehlerfindung.

    Manchmal liegen die Probleme tatsächlich nicht da, wo man sie zuerst vermutet 😉


Anmelden zum Antworten