diff options
author | Robin Gareus <robin@gareus.org> | 2015-09-23 22:23:43 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2015-09-23 22:26:44 +0200 |
commit | fedec84d3b703ebc76281621368a10e3637ebb81 (patch) | |
tree | 30c2c7c52c7cb06f73fdd7d84e9266fc3d95879a /libs/ardour | |
parent | ccf558f482afbe593f5ffd04456fa9e8bbb47168 (diff) |
fix iterator after map::erase().
The iterator referring to the removed element is invalidated.
Other iterators remain valid.
Diffstat (limited to 'libs/ardour')
-rw-r--r-- | libs/ardour/session_state.cc | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc index 346fa0831d..d09385b8bf 100644 --- a/libs/ardour/session_state.cc +++ b/libs/ardour/session_state.cc @@ -2817,25 +2817,34 @@ Session::cleanup_regions () bool removed = false; const RegionFactory::RegionMap& regions (RegionFactory::regions()); - for (RegionFactory::RegionMap::const_iterator i = regions.begin(); i != regions.end(); ++i) { + for (RegionFactory::RegionMap::const_iterator i = regions.begin(); i != regions.end();) { uint32_t used = playlists->region_use_count (i->second); if (used == 0 && !i->second->automatic ()) { + boost::weak_ptr<Region> w = i->second; + ++i; removed = true; - RegionFactory::map_remove (i->second); + RegionFactory::map_remove (w); + } else { + ++i; } } if (removed) { // re-check to remove parent references of compound regions - for (RegionFactory::RegionMap::const_iterator i = regions.begin(); i != regions.end(); ++i) { + for (RegionFactory::RegionMap::const_iterator i = regions.begin(); i != regions.end();) { if (!(i->second->whole_file() && i->second->max_source_level() > 0)) { + ++i; continue; } assert(boost::dynamic_pointer_cast<PlaylistSource>(i->second->source (0)) != 0); if (0 == playlists->region_use_count (i->second)) { - RegionFactory::map_remove (i->second); + boost::weak_ptr<Region> w = i->second; + ++i; + RegionFactory::map_remove (w); + } else { + ++i; } } } |