2012-02-09 25 views
1

我在與我實現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

回答

1

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