Boost's make_shared()
function promises to be exception-safe while attempting to create a shared_ptr
.
Why is there no make_scoped()
equivalent? Is there a common best practice?
Here's a code example from the boost::scoped_ptr
documentation that seems unsafe to me:
boost::scoped_ptr<Shoe> x(new Shoe);
This line of code will do these three things in order:
- Allocate heap memory for
Shoe
- Call the constructor for
Shoe
- Call the constructor for
boost::scoped_ptr<Shoe>
If the constructor for Shoe
throws an exception, memory will be leaked. (see R. Martinho Fernandes answer) The scoped_ptr
won't handle the deallocation because it hasn't been constructed yet.
Is this an oversight? Or is there a solution that I've failed to notice?