使用大小的未初始化值的8

使用大小的未初始化值的8

问题描述:

我在与我实现fwd_iterator一个很奇怪的问题:使用大小的未初始化值的8

如果我用在类中定义的方法的迭代器,他们的工作,但如果我创建一个全局范围的方法,我使用迭代器,valgrind说我正试图访问未初始化的内存。

似乎在类外部创建的迭代器无法读取类的私有属性(即使使用创建的公有方法来执行此操作)。

这是全局范围的方法:

template<typename T, class Pred> 
int evaluate(SparseMatrix<T> &sm, Pred pred){ 
    typename SparseMatrix<T>:: iterator begin, end; 
    int count=0; 
    begin=sm.begin(); 
    end=sm.end(); 
    while(begin!=end){ 
      if(pred(*(begin->data))) count++; 
      begin++; 
    } 
    int dcount=0; 
    if(pred(sm.getDef())) dcount = ((sm.getRows() * sm.getCols()) - sm.getSize()); 
    return count+dcount; 
} 

这里面类方法:

void print_it() { 
    iterator x=begin(); 
    iterator y=end(); 
    int i=1; 
    while(x!=y){ 
     cout<<i<<".("<<(x->i)<<","<<(x->j)<<")="<<*(x->data)<<endl; 
     ++x; 
     i++; 
    } 
    if(x==y) cout<<"End."<<endl; 
    cout<<endl; 
} 

解决:迭代器类有两个属性,VALUE_TYPE缬氨酸,和SM,一个指向类本身的指针。在运算符=(const iterator &其他)我忘了添加后val = other.val; sm = other.sm;线。

现在一切正常!

+0

valgrind暗示哪些源代码行? – 2012-02-09 16:39:05

+2

FWIW,'begin'被分配给,而'x'被初始化。也许你的'SparseMatrix :: operator =(SparseMatrix :: iterator)'被破坏了? – 2012-02-09 16:41:30

+0

有很多代码不会显示给我们。除非有人正确猜测,否则请按照http://sscce.org上的说明进行操作:为您的程序创建一个最小,完整,可编译的副本,并将其粘贴到此处。 – 2012-02-09 16:45:24

iterator类有两个属性,value_type val和sm,指向类本身的指针。在运算符=(const iterator &其他)我忘了添加后val = other.val; sm = other.sm;线。

现在一切正常!

+2

您不需要将“解决”放在全部位置。只是[接受你的回答](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)。 – 2012-02-10 07:43:26