$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
Subject: Re: [boost] [1.37.0][serialization] Assertion failed at libs/serialization/src/extended_type_info.cpp:92
From: Hartmut Kaiser (hartmut.kaiser_at_[hidden])
Date: 2008-10-21 09:30:26
> Anything I can do about this?
> What does this assertion mean?
> 
> My setup: Linux 64Bit, gcc 4.2.4, serialization is used for polymorphic
> objects loaded from different shared libraries, shared libraries are
> loaded with dlopen(RTLD_GLOBAL|RTLD_LAZY).
> 
> Assertion (extended_type_info.cpp:92) occurs during program termination
> (after main returned), during dlclose().
> 
> If anything else isn't possible, would it be appropriate to change the
> related code (before the release!) from:
> 
>         assert(start != end);
> 
>         // remove entry in map which corresponds to this type
>         do{
>             if(this == *start)
>                 x.erase(start++);
>             else
> 		    ++start;
>         }while(start != end);
After looking at this code again I have the impression that it is broken
anyways. You can't safely increment an iterator after deleting the object it
points to: erase(start++). This code relies on the fact that in order to be
incremented the iterator doesn't need the object it points to (which at
least for lists is a wrong assumption).
Regards Hartmut
> 
> To:
> 
>         assert(start != end);
> 
>         // remove entry in map which corresponds to this type
>         while(start != end) {
>             if(this == *start)
>                 x.erase(start++);
>             else
> 		    ++start;
>         }
> 
> Which wouldn't remove the problem, but at least avoids hanging the
> program if assertions are off...
> 
> Regards Hartmut