std::advance - 仅在调试时偏移超出范围失败
Posted
技术标签:
【中文标题】std::advance - 仅在调试时偏移超出范围失败【英文标题】:std::advance - offset out of range failure on Debug only 【发布时间】:2016-04-22 00:38:36 【问题描述】:我正在尝试使用 std::advance 将向量迭代超过 1。 Debug 和 Release 构建之间存在差异,Debug 给出向量迭代器 + 偏移超出范围失败,而 Release 甚至在更扩展的情况下的实际应用程序中也能正常工作。为什么会发生这种情况,我该如何编写它才能在 Debug 上运行?
vector<glm::vec2> testV;
testV.push_back(glm::vec2(0.f));
int step = 2;
for (auto it = testV.begin(); it != testV.end(); )
if (it + step <= testV.end())
advance(it, step);
else
++it;
这也可以在 Release 上运行(除非我在循环中打印导致挂起的内容)
for (auto it = testV.begin(); it != testV.end(); )
advance(it, step);
【问题讨论】:
我正在尝试使用 std::advance 将向量迭代超过 1 -- 这是for
从 0 循环到 @987654324 的情况@ 会是更好的选择。
【参考方案1】:
迭代器的加法运算符正在验证返回的迭代器。当您添加 2 并超过末尾时,这将在调试中产生错误。发布版本没有这些检查,因此不会报告问题。
在容器末尾有一个迭代器点,我认为是未定义的行为。肯定是取消引用。
您必须以其他方式检查是否超出了终点。
【讨论】:
以上是关于std::advance - 仅在调试时偏移超出范围失败的主要内容,如果未能解决你的问题,请参考以下文章
std::search 提取当前迭代器并使用 std::advance 向前移动迭代器