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); }
-
Ergänzung:
http://magazin.c-plusplus.net/artikel/Aufbau%20der%20STL%20-%20Teil%201%3A%20ContainerGanz 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 ); }