Is there some equivalent class for C++1x’s std::unique_ptr in the boost libraries? The behavior I’m looking for is being able to have an exception-safe factory function, like so…
std::unique_ptr<Base> create_base()
{
return std::unique_ptr<Base>(new Derived);
}
void some_other_function()
{
std::unique_ptr<Base> b = create_base();
// Do some stuff with b that may or may not throw an exception...
// Now b is destructed automagically.
}
EDIT: Right now, I’m using this hack, which seems like the best I can get at this point…
Base* create_base()
{
return new Derived;
}
void some_other_function()
{
boost::scoped_ptr<Base> b = create_base();
// Do some stuff with b that may or may not throw an exception...
// Now b is deleted automagically.
}
It’s not possible to create something like
unique_ptrwithout C++0x (where it’s part of the standard library, and so Boost doesn’t need to provide it).Specifically without rvalue references, which are a feature in C++0x, a robust implementation of
unique_ptris impossible, with or without Boost.In C++03, there are a few possible alternatives, although each have their flaws.
boost::shared_ptris probably the simplest replacement in terms of capabilites. You can safely use it anywhere you’d otherwise use aunique_ptrand it’d work. It just wouldn’t be as efficient, because of the added reference counting. But if you’re looking for a simple drop-in replacement that’s able to handle everythingunique_ptrcan do, this is probably your best bet. (Of course, ashared_ptrcan do a lot more as well, but it can also simply be used as a drop-in replacement forunique_ptr.)boost::scoped_ptris similar tounique_ptrbut does not allow transfer of ownership. It works great as long as the smart pointer is meant to retain exclusive ownership throughout its lifetime.std::auto_ptrworks very similar tounique_ptr, but has a few limitations, mainly that it can not be stored in standard library containers. If you’re simply looking for a pointer that allows transfer of ownership, but which is not meant to be stored in containers or copied around, this is probably a good bet.