итераторы std :: unordered_set не считаются недействительными при помощи rehash - PullRequest
0 голосов
/ 25 октября 2018

Я просматривал какой-то старый код и понял, что код неверен, так как он использовал 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, которые предоставляют дополнительные «гарантии»?Или есть проблема с моей тестовой программой.

...