std :: unordered_set迭代器似乎没有被重新哈希无效

时间:2018-10-25 18:20:02

标签: c++ c++11 stl

我正在查看我的一些旧代码,但我意识到该代码是不正确的,因为它在重整期间使用了std::unordered_set迭代器。为了说服自己,我编写了一个小型C ++ 11程序,该程序尝试在重新哈希后重用迭代器:

#include <unordered_set>
#include <vector>
#include <iostream>

int main() {
  std::unordered_set<int> s(5);
  std::vector<std::unordered_set<int>::iterator> its;
  for (int i = 0; i < 100; i++) {
    auto it = s.insert(i);
    its.push_back(it.first);
  }
  s.rehash(200);  // force rehash just in case...
  for (auto it : its) {
    std::cout << *it << "\n";
  }
  for (auto it2 = its[0]; it2 != s.end(); it2++) {
    std::cout << *it2 << "\n";
  }
  for (auto it : its) {
    s.erase(it);
  }
  std::cout << s.size() << "\n";
  return 0;
}

我编译了该程序,并且能够在Valgrind上很好地运行它,这并不是我真正期望的。我尝试使用g ++(5.4.0)和clang ++(3.8.0),但在任何一种情况下都没有出现任何内存错误。有人可以解释为什么吗?它特定于提供额外“保证”的g ++和clang ++ STL实现吗?还是我的测试程序有问题。

0 个答案:

没有答案