// unordered_bug.cxx // Crash with unordered_multimap::erase(iterator, iterator) // g++ -m64 unordered_bug.cxx -O3 -o unordered_bug -I/wrk/hdstaff/stevenl/p4/work_tmp/HEAD/src/ext/Boost/boost_1_51_0 #include #include "boost/unordered_map.hpp" double msec(clock_t start, clock_t end) { return ((end - start) * 1000/CLOCKS_PER_SEC); } void fill_unordered(int items) { boost::unordered_multimap hashmap; for (int i=0,j=items-1; i::value_type(i, i)); hashmap.insert(boost::unordered_multimap::value_type(i, i+1)); if (i > 2) { #if 1 // crash std::pair::iterator, boost::unordered_multimap::iterator> p = hashmap.equal_range(i - 2); hashmap.erase(p.first, p.second); #else // fine hashmap.erase(i-2); #endif } } } void fill (int items) { { std::cout << "filling unordered\n"; clock_t start = clock(); fill_unordered(items); clock_t end = clock(); std::cout << "elapsed time: " << msec(start,end) << "ms\n"; } } int main(int argc, char* argv[]) { if (argc < 2) { std::cout << "usage: fill \n"; return 1; } int items = std::atoi(argv[1]); std::cout << "items: " << items << "\n"; fill(items); return 0; }