Я пробую этот пример в (переведенной на голландский) книге Бьярна Страуструпа (C ++):
#include <vector>
#include <list>
#include "complex.h"
complex ac[200];
std::vector<complex> vc;
std::list<complex> l;
template<class In, class Out> void Copy(In from, In too_far, Out to) {
while(from != too_far) {
*to = *from;
++to;
++from;
}
}
void g(std::vector<complex>& vc , std::list<complex>& lc) {
Copy(&ac[0], &ac[200], lc.begin()); // generates debug error
Copy(lc.begin(), lc.end(), vc.begin()); // also generates debug error
}
void f() {
ac[0] = complex(10,20);
g(vc, l);
}
int main () {
f();
}
** Компиляция и связывание прошло успешно (0 ошибок / предупреждений) **
Но во время выполнения я получаю эту ошибку:
Ошибка отладки!
Программа: путь к exe
file: \ program files \ ms vs studio 10.0 \ vc \ include \ list
Линия: 207
Выражение: итератор списка не разыменовывается
Для получения информации о том, как ваша программа может вызвать ошибку подтверждения, см. Документацию по утверждениям в Visual C ++.
(Нажмите повторить, чтобы отладить приложение)
Оба из следующих ошибочных:
Copy(&ac[0], &ac[200], lc.begin()); // generates debug error
Copy(lc.begin(), lc.end(), vc.begin()); // also generates debug error
Ваш Copy()
функция перезаписывает элементы, начиная с итератора, указанного в качестве третьего аргумента. Поэтому диапазон назначения должен быть действительным и достаточно большим, чтобы вместить все копируемые элементы. ни lc
ни vc
удовлетворить это, поэтому поведение вашего кода не определено.
Один из способов исправить ваш код — использовать std::back_inserter
.
Других решений пока нет …