std vector назначение const_iterator Нарушение прав доступа - PullRequest
1 голос
/ 04 июля 2011

Я работаю над кодом, в котором 1 или более объектов переменной длины хранятся как вектор всех единиц, то есть предполагается, что каждая буква является единицей, а одна и та же буква является одним и тем же объектом высокого уровня. вектор может содержать что-то вроде следующего: aaaabbcccdeeffff ...

Этот вектор является внутренней частной переменной класса, для которого задан оператор [], такой что для вектора выше

 - obj[0] returns an const_iterator to the first "a"
 - obj[1] to the first "b"
 - obj[2] to the first "c" etc.

const AI::GeneArray::const_iterator& AI::Chromosome::operator[](int index) const {
    GeneArray::const_iterator pGene;
    int cIndex;
    for (cIndex=0,pGene = this->vGenes.cbegin();pGene != this->vGenes.cend();pGene++, cIndex++) {
        if (index == cIndex) { break; }
        (*pGene)->EndOfBlock(pGene); }
    return pGene; }

Тогда в другой функции у меня есть следующее

AI::GeneArray::const_iterator function = vChromosome[0];

Это вызывает ошибку нарушения доступа.

Стек вызовов выше моей функции выглядит следующим образом

AI.exe!std::_Vector_const_iterator<std::_Vector_val<AI::Gene *,std::allocator<AI::Gene *> > >::_Vector_const_iterator<std::_Vector_val<AI::Gene *,std::allocator<AI::Gene *> > >(const std::_Vector_const_iterator<std::_Vector_val<AI::Gene *,std::allocator<AI::Gene *> > > & __that)  + 0x2f byte
AI.exe!std::_Iterator012<std::random_access_iterator_tag,AI::Gene *,int,AI::Gene * const *,AI::Gene * const &,std::_Iterator_base12>::_Iterator012<std::random_access_iterator_tag,AI::Gene *,int,AI::Gene * const *,AI::Gene * const &,std::_Iterator_base12>(const std::_Iterator012<std::random_access_iterator_tag,AI::Gene *,int,AI::Gene * const *,AI::Gene * const &,std::_Iterator_base12> & __that)  + 0x2f bytes
AI.exe!std::_Iterator_base12::_Iterator_base12(const std::_Iterator_base12 & _Right)  Line 118
AI.exe!std::_Iterator_base12::operator=(const std::_Iterator_base12 & _Right)  Line 123 + 0x5 bytes

Последний звонок

_Iterator_base12& operator=(const _Iterator_base12& _Right)
    {   // assign an iterator
        if (_Myproxy != _Right._Myproxy)
            _Adopt(_Right._Myproxy->_Mycont);<- This line
        return (*this);
    }

Согласно моему отладчику (Visual C ++ 2010 Express)

_Right._Myproxy->
   _Mycont = CXX0030: Error: expression cannot be evaluated
   _Myfirstiter = CXX0030: Error: expression cannot be evaluated

Иначе, где в моем проекте у меня есть подобный код, использующий std :: list, а не vector, который работает правильно

parents = new ChromosomeList::const_iterator[C];
*(parents) = --(this->vChromosomes.cend());
for (int i=1;i<C;i++) {
    *(parents+i) = ChromosomeList::const_iterator((*(parents+i-1)));
    (*(parents+i))--; }

Я проверил значение, возвращаемое

vChromosome [0]

это значение имеет правильный тип,

const AI::GeneArray::const_iterator &

Я ищу в Google похожие проблемы. Все, что мне удалось найти, - это проблема, связанная с циклическим просмотром вектора с использованием итератора

1032 * т.е. *

for (AI::GeneArray::const_iterator pGene = Genes.cbegin();pGene != Genes.cend();pGene++)

Такой код в моем проекте работает правильно.

1 Ответ

1 голос
/ 04 июля 2011
AI::GeneArray::const_iterator function = vChromosome[0];

Не должен компилироваться.function является итератором, но вы пытаетесь установить для него значение содержимого значения.Вы уверены, что не хотите vChromosome.begin() вместо этого?

Если предположить, что это просто опечатка, ваша ошибка не будет в том месте, где происходит назначение, ваша ошибка будет где-то до этого.Например, vChromosome может быть пустым, и в этом случае попытка доступа к operator[](0) приведет к неопределенному поведению.(Проверьте, является ли вектор первым даже допустимым!)

(Примечание:

parents = new ChromosomeList::const_iterator[C];

Почему вы управляете таким массивом вручную? Разве не для этого vector? :))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...