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