Programmzeile führt zu unerklärlichem Absturz.



  • Hallo

    Ich habe versucht einen eigenen Iterator zu schreiben. Hier der Code dazu:

    class myClass : public iterator<input_iterator_tag,string>,
        private boost::equality_comparable<myClass>,
        private boost::incrementable<myClass>
    {
    private:
        unsigned int m_counter;
        vector<string> m_vector;
        string m_text;
    
    public:
        myClass(int i) : m_counter(i) { }
    
        myClass(const vector<string>& v) :
            m_counter(0),
            m_vector(v)
        {
            srand ( time(NULL) );
            m_text = m_vector.at(0);
        }
    
        string operator*() const
        {
            return m_text; // Nach Aufruf dieser Funktion stürzt das Programm ab.
        }
    
        myClass& operator++()
        {
            string str = m_text.substr(m_text.length() - 2); // Wenn diese Zuweisung ausgeklammert wird, tritt der Fehler nicht auf.
            int pos = rand()%m_vector.size();
            m_text = m_vector.at(pos).substr(2);
            m_counter++;
            return *this;
        }
    
        bool operator==(myClass const &other) const
        {
            return this->m_counter >= other.m_counter;
        }
    };
    

    Wenn ich die markierte Programmzeile nicht ausklammere und versuche den Iterator zu benutzen, bekomme ich immer einen Absturz des Programmes mit exit code 255. Laut Google steht das für "The extended attributes are inconsistent." Am Anfang lieferte mir der Debugger noch eine Meldung das ich auf geschützen Speicher zugreife, irgendwann kam die aber dann nicht mehr und das Programm stürzte ohne eine weitere Meldung ab.
    Wenn ich nicht einen Substring sondern die ganze Variable m_text zuweise, bekomme ich auch keinen Absturz.
    Hier noch die Implementation, wie ich den Iterator anwende:

    // ...
        vector<string> v;
        // ...
        myClass anfang(v);
        myClass ende(100);
        copy(anfang, ende, ostream_iterator<string>(cout, "\n"));
        // ...
    

    Ich kann mir absolut nicht erklären, wie es zu diesem Fehler kommen kann. Ich hoffe, ihr könnt mir da weiterhelfen.

    Vielen Dank.



  • Vermutlich crasht es wenn m_text.length() < 2 wird, und der Ausdruch daher "unterläuft".

    Dann übergibst du ~~4 milliarden an substr(), und wenn die substr() Implementierung keine Parameter validiert knallt es eben.


Anmelden zum Antworten