Boost logo

Boost :

From: Joaquín Mª López Muñoz (joaquin_at_[hidden])
Date: 2004-04-12 11:59:03


Robert Ramey ha escrito:

> Joaquin Munoz wrote:
>
> > I think I detected a minor bug in collections_load_imp.hpp.
> > The operator() code for archive_input_seq reads:
>
> > inline void operator()(Archive &ar, Container &s)
> > {
> > typedef BOOST_DEDUCED_TYPENAME Container::value_type type;
> > stack_allocate<type> t;
> > load_construct_data(ar, t.address(), 0U);
> > ar >> make_nvp("item", t.reference());
> > s.push_back(t.reference());
> > t.address()->~type(); // undo load_construct_data above
> > }
>
> > This is AFAICS not exception-safe: if say s.push_back()
> > throws, the dtor for the stack-allocated variable t won't
> > be called. The same problem in similar code snippets
> > through this file. Apologies if my perception is wrong.
>
> Hmmm - An interesting point I never considered. Push_back from the standard
> library has a strong guarantee so the problem should boil down to one of the
> constructors (copy or inplace) throwing.

push_back() can also throw from the allocator if it runs out of memory,
so you really need some proper clenaup regardless of the guarantees
made by copying ops. Dave's suggestion of using RAII is probably the
most elegant way to deal with the situation: in my experience, however,
this sort of scope guards perform worse than a try{}catch(...){}. Your
mileage may vary.

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