如何删除不兼容的矢量迭代器'错误?

时间:2015-02-27 15:43:25

标签: c++ vector

我继承了几千行代码的责任,在许多地方生成了不兼容的矢量迭代器'调试模式中的错误。我目前正在使用Visual Studio Professional 2013版本12.0.31101.00 Update 4.

产生此错误的代码示例:

 int SqlHandler::VerifyColumnsInFilters (std::vector<TERMS*>*WhereFields,const int Idx, 
                                     std::vector<TABLES *>*Tables)
{
    int Status = 0; 
    for (std::vector<TERMS *>::iterator witer = WhereFields [Idx].begin (); 
    witer != WhereFields [Idx].end (); ++witer) 
    {

我已尝试将上述代码更改为:

std::vector<TERMS *>& whereVector = WhereFields[Idx];
for(std::vector<TERMS *>::iterator witer = whereVector.begin(); witer != whereVector.end(); ++witer)

而且:

std::vector<TERMS *>& whereVector = WhereFields[Idx];
for(auto& termsPtr : whereVector)

在每种情况下都会生成相同的向量迭代器不兼容错误。忽略C风格分配缓冲区和向量的奇怪混合。在调试模式下导致错误的原因是什么?此代码似乎在发布模式下正确执行,我真的希望能够在调试器中逐步执行它。

由于

编辑以回应评论: WhereFields [Idx]是for循环之前的有效向量。

产生此错误的代码的完整示例是:

int SqlHandler::VerifyColumnsInFilters (std::vector<TERMS *>*WhereFields, 
                                     const int Idx, 
                                     std::vector<TABLES *>*Tables)
{
    int Status = 0; 

    std::vector<TERMS *>& whereVector = WhereFields[Idx];
    for(auto& termsPtr : whereVector)
    {
        for(std::vector<Term *>::iterator iter = termsPtr->T.begin();
            iter != termsPtr->T.end(); ++iter)
        {
            if((*iter)->sub_q >= 0)
            {
                continue;
            }           
        }
    }

循环中的任何内容都不会以任何方式改变实际的矢量。

整个错误消息是:矢量迭代器不兼容 这是从c:\ Program Files(x86)\ Microsoft Visual Studio 12.0 \ VC \ include \ vector

中的此代码生成的
#if _ITERATOR_DEBUG_LEVEL == 2
    void _Compat(const _Myiter& _Right) const
        {   // test for compatible iterator pair
        if (this->_Getcont() == 0
            || this->_Getcont() != _Right._Getcont())
            {   // report error
            _DEBUG_ERROR("vector iterators incompatible");
            _SCL_SECURE_INVALID_ARGUMENT;
            }
        }

1 个答案:

答案 0 :(得分:0)

我的通灵调试技巧告诉我Idx没有指向WhereFields指向的向量数组的有效成员(最可能的猜测是向量已经被破坏但引用了它仍然存在 - 它可能仍然显示有效,但实际上已经死了)。您应该检查调用点以查找Idx的值,并确认已在WhereFields数组中正确构造了向量。