[英]Why do I get this Debug Assertion Failed? Expression: list iterator not dereferenceable
我正在Bjarne Stroustrup(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的路徑
文件:\\ 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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.