std vector const_iterator赋值访问冲突

时间:2011-07-04 02:20:40

标签: c++ iterator variable-assignment runtime-error stdvector

我正在处理代码,其中存储一个或多个可变长度对象作为所有单元的向量,即假设每个字母是一个单元,并且相同的字母是相同的高级对象。 向量可能包含以下内容:aaaabbcccdeeffff ...

这个向量是一个类的内部私有变量,它定义了一个operator [],对于上面的向量

 - 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 &

我在谷歌搜索类似的问题,所有我能找到的问题都与使用迭代器的循环遍历

相关的问题

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

我项目中的此类代码工作正常。

1 个答案:

答案 0 :(得分:1)

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

不应该编译。 function是一个迭代器,但您尝试将其设置为值内容的值。您确定不想要vChromosome.begin()吗?

假设这只是一个错字,你的错误将不会在分配发生的地方,你的错误将在此之前的某个地方。 vChromosome可能为空,例如,在这种情况下,尝试访问operator[](0)会导致未定义的行为。 (先看看矢量是否有效!)

(旁注,

parents = new ChromosomeList::const_iterator[C];

为什么要手动管理这样的数组?这不是vector的用途吗? :) )