首先:如果有人能想到更简洁的表达方式,我很乐意更新标题中的问题。
情况如下:
我有一个向量作为班级成员。使用以下内容从向量中提取元素后:
inline int currentToken()
{
/* __it is of type std::vector <int>::iterator */
return (__it < __tokens.begin()) ? Syntax::OUT_OF_RANGE_BEGIN :
(__it > __tokens.end()) ? Syntax::OUT_OF_RANGE_END :
*__it;
}
返回的整数与预期的完全一样(在本例中为 65,它应该是)。
然而,现在事情变得棘手了。当遇到这个特定的标记时,它会引发一个新的事件链,并且需要丢弃向量中以前的标记。
首先,我调用类的“saveLocation”成员函数,它是一个内联快捷方式:
__saved_it = __it;
然后,我调用 'truncateHead' 成员函数,这是错误发生的地方。在代码之前,我想指出,以上都没有以任何方式改变向量,所以绝对没有理由重新分配向量的内存。
__it = __tokens.erase(__tokens.begin(), __saved_it+1); //segfault
一些调试显示不知何故__it
大于__tokens.end()
,即使它仍然大于__begin
并且按预期取消引用到数字“65”。
它怎么不在 和 之间的范围__tokens.begin()
内__tokens.end()
?
事实上,这种情况在上述saveLocation
方法中已经存在。
记住currentToken()
紧随其后的是saveLocation()
, 并且如果迭代器已经超出范围currentToken
会返回整数表示,我很困惑。OUT_OF_RANGE_END
彻底而彻底。