
On Fri, Jun 5, 2009 at 7:34 PM, Robert Ramey
I believe I've fixed this at least on my machine and perhaps on the trunk. I'm tracking down a couple of other bugs but I don't know that I'll be able to get all these fixes tested and checked in by the 15 June deadline for 1.40
Thank you for your prompt answer, I am sincerely honored by having it. As far as I understand, the fix is in recursive_unregister: BOOST_SERIALIZATION_DECL(void) void_caster::recursive_unregister() const { if(void_caster_registry::is_destroyed()) return; void_cast_detail::set_type & s = void_caster_registry::get_mutable_instance(); // delete all implied void_casts. void_cast_detail::set_type::iterator it; for(it = s.begin(); it != s.end(); ++it){ if((*it)->is_shortcut()){ if(m_derived == (*it)->m_base || (*it)->m_derived == m_base){ s.erase(it); // <<< HERE <<< delete *it; it = s.begin(); } } } I am under the impression that after s.erase(it) the iterator might be invalid and dereferencing it in the following statement might lead to undefined behaviour. Actually an error is given when I compile and run it on VC2005 (only tried debug conf). What do you think of the following variant: ... if(m_derived == (*it)->m_base || (*it)->m_derived == m_base){ void_cast_detail::set_type::value_type v = *it; s.erase(it); delete v; it = s.begin(); } ... It seems safer to me and eliminates the error. Thank you in advance for any possible further advice on the subject. Regards, eca