2012-03-16 46 views
-1
Distance distance(const vector<long> &x, const vector <short> &y) 
{ 
    Distance total = 0.0; 
    Distance diff; 

    vector <long >::const_iterator cpx=x.begin(); //terminates at this line 

    vector <short>::const_iterator cpy=y.begin(); 
    vector <long>::const_iterator cpx_end=x.end(); 
    for(;cpx!=cpx_end;++cpx,++cpy){ 
     diff = *cpx - *cpy; 
     total += (diff * diff); 
    } 
    return total; 
} 

距離很長很長int。std :: vector使用const_iterator終止程序

我的代碼終止時,我試圖分配const迭代器與矢量的開始? 爲什麼會發生這種情況? 向量被初始化爲零。

+3

請提供調用此函數的代碼(最低限度)以及您在程序終止時收到的任何錯誤消息。你有沒有調試過這個? – 2012-03-16 12:02:20

+2

如果你的意思是「memset(&vec,0,sizeof(vec))」和「向量初始化爲零」,那麼這就是你的問題。 – stefaanv 2012-03-16 12:37:32

+0

@KerrekSB不介意,但你是盲目的不能看到cpx和cpy是迭代器聲明和分配在同一行代碼中.. – shofee 2012-03-16 13:16:52

回答

1

代碼本身沒有任何無效。顯然x矢量在你撥打distance之前已經有些損壞了,無論是它的一生已經結束了,或者你已經有記憶corbal或其他一些UB。例如。像這樣的東西:

 

vector<long> &getData() 
{ 
    vector<long> data; 
    // fill data 
    return data; 
} 

// ... 

distance(getData(), y); 
 
 

vector<long> *data = new vector<long>(); 
// fill data 

delete data; 

distance(*data, y); 
 
 

long data[n] = ...; 
vector<long> x(n); 
memcpy(&x, data, sizeof(data)/sizeof(data[0])); 
 
 

vector<long> *data = 0; 

distance(*data, y); 
 

而且可能有更多的其他情況下,無論如何,解決的辦法是檢查地方x來自何地被破壞或變爲無效。