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