Fehler bei std::copy



  • Ich habe versucht std::copy zu verwenden in folgender Weise:

    void Task::writeDataRecieved(double * dataArray, size_t datasize)
    {
       // save end Iterator of old saveDataArray size
       vector<double>::iterator copyToIterator = saveDataArray.end();
       // resize with new totalsize
       saveDataArray.resize(saveDataArray.size() + datasize);
       // copy from ... to ...
       std::copy ( dataArray, dataArray + datasize, copyToIterator);
    }
    

    das stürzt aber mit einer Exception in std::copy ab (Exception at 0x375b84, code: 0x80000003: breakpoint, flags=0x0)

    sieht vielleicht jemand einen logischen Fehler?



  • Durch das Resize werden (sehr wahrscheinlich, je nach Veränderung) die Elemente an eine andere Speicherstelle kopiert. Daher sind alle bisherigen Iteratoren ungültig.

    void Task::writeDataRecieved(double * dataArray, size_t datasize)
    {
       // save end Iterator of old saveDataArray size
       int aOldSize = saveDataArray.size();
       // resize with new totalsize
       saveDataArray.resize(saveDataArray.size() + datasize);
       // copy from ... to ...
       std::copy ( dataArray, dataArray + datasize, saveDataArray.begin() + aOldSize);
    }
    

  • Administrator

    Ergänzung:
    http://magazin.c-plusplus.net/artikel/Aufbau%20der%20STL%20-%20Teil%201%3A%20Container

    Ganz unten ist eine Tabelle, welche Auskunft darüber gibt, ob die Iteratoren ungültig werden.

    Grüssli



  • Du solltest einfach einen std::back_inserter benutzen:

    void Task::writeDataRecieved(double * dataArray, size_t datasize)
    {
       // copy from ... to ...
       std::copy ( dataArray, dataArray + datasize, std::back_inserter(saveDataArray));
    }
    


  • Das ganze kann man auch so schreiben ohne std::copy zu verwenden.

    void Task::writeDataRecieved(double * dataArray, size_t datasize)
    {
        saveDataArray.insert(
            saveDataArray.end(), // Am ende einfügen
            dataArray,           // von 
            dataArray + datasize // bis
        );   
    }
    

Anmelden zum Antworten