Boost logo

Boost :

From: Robert Ramey (ramey_at_[hidden])
Date: 2004-04-12 10:58:10


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. Try/catch block could be added but
it could be a little expensive for large collections and would be
unnecessary in the most common case where inplace and copy constructors
don't throw. I would like to use has_nothrow_constructor and has_trhow copy
to address this but the language in the type_traits document suggests that
this wouldn't be effective. Anyone is free to chime in here.

Robert Ramey


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk