Я работаю над кодом, в котором 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++)
Такой код в моем проекте работает правильно.