From: JOAQUIN LOPEZ MU?Z (joaquin_at_[hidden])
Date: 2007-01-02 13:36:21
----- Mensaje original -----
De: Thorsten Ottosen <thorsten.ottosen_at_[hidden]>
Fecha: Martes, Enero 2, 2007 6:44 pm
Asunto: Re: [boost] Weird behaviour/bug in ptr_map
> Thorsten Ottosen wrote:
> > Joshua Moore-Oliva wrote:
> > It appears that every single erase (including that done by
> >a key) has an assert for the
> >list not being empty!
> I could not see that assertion in the 1.34 RC branch? Are your
> from 1.33?
> Here's the definition from 1.34:
> size_type erase( const key_type& x ) // nothrow
> iterator i( this->c_private().find( x ) ); // nothrow
> if( i == this->end() ) // nothrow
> return 0u; // nothrow
> this->remove( i ); // nothrow
> return this->c_private().erase( x ); // nothrow
> This works fine if the map is empty.
Hello Thorsten, this issue was already raised and corrected
on September 2005, you might want to consult the thread at
> Wheter the overload that takes an iterator should be allowed to
> accept the end iterator is another issue. I'll give it some
My humble opinion is that you shouldn't allow an an end iterator
to be legally passed to erase(iterator), that is, your current
BOOST_ASSERT( before != this->end() );
is conformig. The rational is that erase(end()) is illegal, or
at least undefined behavior, in STL containers.
The additional check
BOOST_ASSERT( !this->empty() );
at the same member function is almost immaterial, since if
the container is empty then end() is the only valid iterator
that can be possibly passed in.
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk