我在與我實現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;線。
現在一切正常!
valgrind暗示哪些源代碼行? – 2012-02-09 16:39:05
FWIW,'begin'被分配給,而'x'被初始化。也許你的'SparseMatrix :: operator =(SparseMatrix :: iterator)'被破壞了? –
2012-02-09 16:41:30
有很多代碼不會顯示給我們。除非有人正確猜測,否則請按照http://sscce.org上的說明進行操作:爲您的程序創建一個最小,完整,可編譯的副本,並將其粘貼到此處。 – 2012-02-09 16:45:24