簡體   English   中英

為什么我的調試斷言失敗? 表達式:列表迭代器不可取消引用

[英]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()函數會覆蓋從作為第三個參數提供的迭代器開始的元素。 因此,目標范圍必須有效且足夠大以容納所有要復制的元素。 lcvc都不滿足此要求,因此代碼的行為是不確定的。

修復代碼的一種方法是使用std::back_inserter

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM