Использование неинициализированного значения размера 8 - PullRequest
1 голос
/ 09 февраля 2012

У меня довольно странная проблема с реализуемым fwd_iterator:

если я использую итераторы в методах, определенных внутри класса, они работают, но если я создаю метод с глобальной областью действия, в котором я использую итераторы, 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 val и sm, указатель на сам класс. В operator = (const iterator & other) я забыл добавить после val = other.val; sm = other.sm; линия.

Теперь все работает!

1 Ответ

1 голос
/ 10 февраля 2012

Итератор класса имеет два атрибута, value_type val и sm, указатель на сам класс.В operator = (const iterator & other) я забыл добавить после val = other.val;sm = other.sm;line.

Теперь все работает!

...