SEGFAULT: bei Klasse mit string als Member



  • Hi

    Habe ein Problem, beim Kopieren einer Klasse mit std::copy bekomm ich einen Seg. fault. Der Debugger verweisst auf den operator= der Klasse und darin auf "std::string::assign () from /usr/lib/libstdc++.so.6" 😕
    Hier noch ein Minimalbeispiel:

    class Test
        {
        public:
            Test()
            {}
            Test( const Test& other )
            :   m_key( other.m_key )
            {}
            const Test& operator=( const Test& other )
            {
                m_key = other.m_key;
                return *this;
            }
        private:
            std::string m_key;
        };
    
    int main()
    {
        std::vector<Test> source( 42 );
        std::vector<Test> target;
        std::copy( source.begin(), source.end(), target.begin() );
    }
    

    Bin grad recht ratlos.
    Was mach ich falsch? 😞
    Danke



  • Du hast vergessen, in target genug Platz für die reinkopierten Objekte anzulegen. Also entweder du vergrößerst es vor dem copy()-Aufruf oder du verwendest back_inserter.

    (Nein, copy() ist nicht in der Lage, selber für Speicher zu sorgen.)



  • Dein Zielvektor ist leer, du schreibst also auf Elemente außerhalb des gültigen Bereichs. Du willst wahrscheinlich einen back_inserter benutzen.

    Edit: Hmpf gegen CStoll kommt man nicht an 😉 Also noch was substanzielles: Spar dir den Kopierkonstruktor und den Zuweisungsoperator, die brauchst du hier nicht.



  • Target hat nicht so viele Elemente.
    Inserter wären eine Lösung:

    std::copy( source.begin(), source.end(), std::back_inserter(target) );
    


  • Bashar schrieb:

    Edit: Hmpf gegen CStoll kommt man nicht an 😉

    Klar, du mußt nur die richtige Zeit dafür finden 😃


Anmelden zum Antworten