我有一个 C++ 应用程序,它有一次我无法重现的断言失败。这是一次失败的代码:

unsigned int test(std::vector<CAction> actionQueue) {
  unsigned int theLastCount = actionQueue.size() - 1;

  std::vector<CAction>::const_reverse_iterator rItr = actionQueue.rbegin();
  std::vector<CAction>::const_reverse_iterator rEndItr = actionQueue.rend();

  for (; rItr != rEndItr; ++rItr, --theLastCount) {
    const CAction &fileAction = *rItr;

    if (fileAction.test()) {
      continue;
    }
    return theLastCount;
  }

  assert(theLastCount == 0); // How could this fail?

  return theLastCount;
}

不知何故,循环完成后,LastCount 不为零。

从我对逻辑的阅读来看,这应该是不可能的,除非:
  • 其他一些线程对 actionQueue 产生了影响(我认为这是不可能的)。
  • 发生了一些暂时的内存损坏。

  • 我是否在这里遗漏了一些愚蠢的东西,我的代码中是否有错误?请注意,在我看到这一点的情况下,theLastCount 应该已初始化为 1,因为该 vector 有两个元素。

    最佳答案

    我相信如果所有文件操作都通过了 test(),则最后一个计数将为 -1。考虑:

    theLastCount 从 actionQueue.size() -1 开始。您为 actionQueue 中的每个项目将其递减一次 - 即现在是 actionQueue.size() - 1 - actionQueue.size() = -1。想想看。 theLastCount 保留当前迭代器的索引。但是当当前迭代器是 rend 时,那么它是数组开头之前的一个迭代器 - 即 -1。

    编辑:哦,它没有签名。但是由于您只测试相等性为零,因此积分溢出在这里无关紧要。

    关于c++ - 这段代码如何表现得如我所见?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4701808/

    10-10 03:37