2012-03-16 47 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来自何地被破坏或变为无效。