使用大小的未初始化值的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;线。
现在一切正常!
答
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
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