On Fri, Jun 5, 2009 at 7:34 PM, Robert Ramey <ramey@rrsd.com> wrote:
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