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 向前移动迭代器

如何推导出 std::advance 迭代器类型?

Kafka 消费者偏移超出范围,没有为分区配置重置策略

kivy 中超出了最大递归深度,但仅在打包时超出,而不是在使用 python 开发应用程序时

如果 fseek 中的给定偏移量超出最后一个字符会发生啥

c++ 断言字符串迭代器偏移超出范围