我继承了几千行代码的责任,在许多地方生成了不兼容的矢量迭代器'调试模式中的错误。我目前正在使用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;
}
}
答案 0 :(得分:0)
我的通灵调试技巧告诉我Idx
没有指向WhereFields
指向的向量数组的有效成员(最可能的猜测是向量已经被破坏但引用了它仍然存在 - 它可能仍然显示有效,但实际上已经死了)。您应该检查调用点以查找Idx
的值,并确认已在WhereFields
数组中正确构造了向量。